JavaFX TableView 填充数组按钮
JavaFX TableView fill with Buttons of Array
所以我试图让一个 TableView 来表示几排座位。所以一行表示一个class"Reihe"(德语"row")的Object。一个Reihe有一个Sitzplatz("seat")的数组。每个座位都有一个按钮,应该显示在座位单元格中。
所以我对 TableColumns 的 cellFactories 有点困惑。如何让 Columns 显示来自 row.seat[columnIdx] 的座位按钮?
我不能 return ObservableValue< Button> 对吗?那么我用什么作为 CellFactories?
Class "Reihe"(=行):
public class Reihe implements DataObject
{
private Sitzplatz[] seats;
public Reihe(int seats,int saal)
{
this.seats=new Sitzplatz[seats];
for(int i=0; i<this.seats.length; i++)
{
this.seats[i]=new Sitzplatz();
this.seats[i].setSaal_SID(""+saal);
}
}
public Sitzplatz getSeat(int idx)
{
return seats[idx];
}
...
Class "Sitzplatz" ("seat"):
public class Sitzplatz implements DataObject
{
private SimpleStringProperty platz, reihe,saal_SID, reservierung_REID;
private SeatButton button;
public Sitzplatz()
{
this.platz=new SimpleStringProperty();
this.saal_SID=new SimpleStringProperty();
this.reihe=new SimpleStringProperty();
this.reservierung_REID=new SimpleStringProperty();
button=new SeatButton();
}
public SeatButton getButton()
{
return button;
}
...
列的初始化:
for(int j=0; j<seatColumns; j++)
{
TableColumn<Reihe,Button> nColumn=new TableColumn<>("Seat"+j);
//final int idx=j;
nColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Reihe, Button>, ObservableValue<Button>>() {
@Override
public ObservableValue<Button> call(TableColumn.CellDataFeatures<Reihe, Button> p) {
// ???
}
});
nColumn.setMinWidth(50);
nColumn.setEditable(true);
//getColumns().add(nColumn);
getColumns().add(nColumn);
}
我发现了一些关于使用 Button extends TableCell 的信息,但我还是无法真正弄清楚它应该如何工作:
public class SeatButton extends TableCell<Reihe, Button>
{
Button cellButton;
//private Sitzplatz seat;
public SeatButton()
{
//seat=row.getSeat(column);
cellButton=new Button();
cellButton.setMinWidth(30);
cellButton.setOnAction(new EventHandler<ActionEvent>(){
@Override
public void handle(ActionEvent t) {
//....
}
});
}
}
您不应将 GUI 元素放入模型中。在这种情况下,它更没有意义,因为 SeatButton
扩展 TableCell
并且 TableCell
创建独立于项目。另外 item
被 TableView
分配给 TableCell
,并且 TableCell
的项目可能是 changed/removed.
使用 cellValueFactory
到 return 给定列的 Sitzplatz
并使用 cellFactory
那 returns TableCell<Reihe, Sitzplatz>
:
for(int j=0; j<seatColumns; j++) {
final index = j;
TableColumn<Reihe, Sitzplatz> nColumn = new TableColumn<>("Seat"+j);
nColumn.setCellValueFactory(p -> new SimpleObjectProperty<>(p.getValue().getSeat(index)));
nColumn.setCellFactory(c -> new SeatButton<>());
nColumn.setMinWidth(50);
nColumn.setEditable(false); // you want to modify items not replace them
getColumns().add(nColumn);
}
public class SeatButton<T> extends TableCell<T, Sitzplatz> {
Button cellButton;
public SeatButton() {
cellButton=new Button();
cellButton.setMinWidth(30);
cellButton.setOnAction(new EventHandler<ActionEvent>(){
@Override
public void handle(ActionEvent t) {
//....
}
});
}
@Override
protected void updateItem(Sitzplatz item, boolean empty) {
super.updateItem(item, empty);
if (empty || item == null) {
setGraphic(null);
} else {
setGraphic(cellButton);
// TODO: adjust button according to data
}
}
}
所以我试图让一个 TableView 来表示几排座位。所以一行表示一个class"Reihe"(德语"row")的Object。一个Reihe有一个Sitzplatz("seat")的数组。每个座位都有一个按钮,应该显示在座位单元格中。 所以我对 TableColumns 的 cellFactories 有点困惑。如何让 Columns 显示来自 row.seat[columnIdx] 的座位按钮? 我不能 return ObservableValue< Button> 对吗?那么我用什么作为 CellFactories?
Class "Reihe"(=行):
public class Reihe implements DataObject
{
private Sitzplatz[] seats;
public Reihe(int seats,int saal)
{
this.seats=new Sitzplatz[seats];
for(int i=0; i<this.seats.length; i++)
{
this.seats[i]=new Sitzplatz();
this.seats[i].setSaal_SID(""+saal);
}
}
public Sitzplatz getSeat(int idx)
{
return seats[idx];
}
...
Class "Sitzplatz" ("seat"):
public class Sitzplatz implements DataObject
{
private SimpleStringProperty platz, reihe,saal_SID, reservierung_REID;
private SeatButton button;
public Sitzplatz()
{
this.platz=new SimpleStringProperty();
this.saal_SID=new SimpleStringProperty();
this.reihe=new SimpleStringProperty();
this.reservierung_REID=new SimpleStringProperty();
button=new SeatButton();
}
public SeatButton getButton()
{
return button;
}
...
列的初始化:
for(int j=0; j<seatColumns; j++)
{
TableColumn<Reihe,Button> nColumn=new TableColumn<>("Seat"+j);
//final int idx=j;
nColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Reihe, Button>, ObservableValue<Button>>() {
@Override
public ObservableValue<Button> call(TableColumn.CellDataFeatures<Reihe, Button> p) {
// ???
}
});
nColumn.setMinWidth(50);
nColumn.setEditable(true);
//getColumns().add(nColumn);
getColumns().add(nColumn);
}
我发现了一些关于使用 Button extends TableCell 的信息,但我还是无法真正弄清楚它应该如何工作:
public class SeatButton extends TableCell<Reihe, Button>
{
Button cellButton;
//private Sitzplatz seat;
public SeatButton()
{
//seat=row.getSeat(column);
cellButton=new Button();
cellButton.setMinWidth(30);
cellButton.setOnAction(new EventHandler<ActionEvent>(){
@Override
public void handle(ActionEvent t) {
//....
}
});
}
}
您不应将 GUI 元素放入模型中。在这种情况下,它更没有意义,因为 SeatButton
扩展 TableCell
并且 TableCell
创建独立于项目。另外 item
被 TableView
分配给 TableCell
,并且 TableCell
的项目可能是 changed/removed.
使用 cellValueFactory
到 return 给定列的 Sitzplatz
并使用 cellFactory
那 returns TableCell<Reihe, Sitzplatz>
:
for(int j=0; j<seatColumns; j++) {
final index = j;
TableColumn<Reihe, Sitzplatz> nColumn = new TableColumn<>("Seat"+j);
nColumn.setCellValueFactory(p -> new SimpleObjectProperty<>(p.getValue().getSeat(index)));
nColumn.setCellFactory(c -> new SeatButton<>());
nColumn.setMinWidth(50);
nColumn.setEditable(false); // you want to modify items not replace them
getColumns().add(nColumn);
}
public class SeatButton<T> extends TableCell<T, Sitzplatz> {
Button cellButton;
public SeatButton() {
cellButton=new Button();
cellButton.setMinWidth(30);
cellButton.setOnAction(new EventHandler<ActionEvent>(){
@Override
public void handle(ActionEvent t) {
//....
}
});
}
@Override
protected void updateItem(Sitzplatz item, boolean empty) {
super.updateItem(item, empty);
if (empty || item == null) {
setGraphic(null);
} else {
setGraphic(cellButton);
// TODO: adjust button according to data
}
}
}