Заполнение JavaFX TableView кнопками массива - PullRequest
0 голосов
/ 10 мая 2018

Итак, я пытаюсь получить TableView для представления рядов мест.Таким образом, строка представляет Объект класса "Reihe" (немецкий "row"). Рейх имеет массив Sitzplatz ("место").Каждое место имеет кнопку, которая должна отображаться в ячейке сидений.Поэтому я немного запутался по поводу cellFactories для TableColumns.Как мне указать Columns для отображения кнопки сиденья из row.seat [columnIdx]?Я не могу вернуть ObservableValue

Класс "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];
 }
    ...

Класс "Sitzplatz" ("место"):

 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) {

            //....
        }
    });
 }
}

1 Ответ

0 голосов
/ 10 мая 2018

Вы не должны помещать элементы GUI в модель. В этом случае это имеет еще меньший смысл, поскольку SeatButton расширяет TableCell, а TableCell создание не зависит от элементов. Также item s присваивается TableCell s с помощью TableView, и элемент TableCell может быть изменен / удален.

Используйте cellValueFactory для возврата Sitzplatz для данного столбца и используйте cellFactory, который возвращает 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
        }
    }
}
...