TableColumn не отображает значения (JavaFX 11)

Я сделал TableView с двумя столбцами: первый назначен значению из класса из списка, импортированному из другого TableView через модель выбора, второй назначен некоторому значению класса. Но второй столбец по-прежнему остается пустым.

Я настраиваю TableView, который содержит ник игрока (String) и его место (int). Я сгенерировал в основном элементе управления TableView, который был сгенерирован из таблицы SQL с помощью Hibernate. Значения игрока, импортированные из таблицы SQL, аннотируются @Column, значение «место» имеет аннотацию @Transient. Я пытался сделать это методами, найденными в стеке, но здесь они не работают.

Вот контроллер, который содержит TableView:

public class SeatsController {
private ObservableList<Player> players;

@FXML private TableView<Player> playersTableSeats;
@FXML private TableColumn playerColumn;
@FXML private TableColumn<Player, String> seatColumn;

@FXML private TextField seatField;

public void initialize() {
    players = FXCollections.observableArrayList();
    playersTableSeats.setItems(players);
    seatColumn.setCellValueFactory(cellData -> new 
SimpleStringProperty(cellData.getValue().getSeat()+"", "seat"));
}

public void manageSeats(List<Player> list) {
    players.addAll(list);
}

@FXML
public void setSeat() {
    Player selectedPlayer = 
playersTableSeats.getSelectionModel().getSelectedItem();
    selectedPlayer.setSeat(Integer.parseInt(seatField.getText()));
    playersTableSeats.setItems(players);
    System.out.println(selectedPlayer.getSeat());
}
}

Часть файла FXML (seats.fxml):

<TableView fx:id="playersTableSeats">
    <columns>
        <TableColumn fx:id="playerColumn" text="Nickname">
            <cellValueFactory>
                <PropertyValueFactory property="nickname"/>
            </cellValueFactory>
        </TableColumn>
        <TableColumn fx:id="seatColumn" text="Seat">
            <cellValueFactory>
                <PropertyValueFactory property="seat"/>
            </cellValueFactory>
        </TableColumn>
    </columns>
</TableView>
<HBox>
    <Label text="Set place:"></Label>
    <TextField fx:id="seatField"></TextField>
    <Button text="OK" onAction="#setSeat"></Button>
</HBox>

Класс игрока:

@Entity
@Table(name = "Players")
@Getter
@Setter
public class Player {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;

@Column(name = "nickname")
private String nickname;

@Column(name = "chips")
private int chips;

@Column(name = "notes")
private String notes;

@Transient
private int seat;

[some values with @Transient]

public Player() {}

public Player(int id, String nickname, int chips, String notes) {
    this.id = id;
    this.nickname = nickname;
    this.chips = chips;
    this.notes = notes;
    seat = -1;
}
}

Геттеры и сеттеры по умолчанию (созданные ломбоком, но все равно).

Запуск данного контроллера вызван:

SeatsController seatsController = fxmlLoader.getController();
seatsController.manageSeats(selectedPlayers);

в главном контроллере после правильного выбора и нажмите кнопку «Выполнить!».

https://i.imgur.com/oyJ3rQ5.png

Я пытаюсь что-то сделать с помощью seatColumn.setCellValueFactory([лямбда]) и setCellValue([лямбда]), но все мои попытки терпят неудачу.


person Wojciech Pawlik    schedule 30.12.2018    source источник


Ответы (1)


Вы используете неправильный конструктор SimpleStringProperty по назначению:

SimpleStringProperty​(Object bean, String name) получает только "метаданные" о свойстве, но фактически не инициализирует значение:

  • bean — это объект, содержащий свойство
  • name — это строка, содержащая имя свойства

Оба используются для назначения свойств с тем же именем для объекта свойства.

TableView ничего не делает с этими свойствами. Он просто использует значение, которое не присваивается используемым конструктором, и поэтому остается с начальным значением null.

Вы могли бы использовать

seatColumn.setCellValueFactory(cellData -> new SimpleStringProperty(Integer.toString(cellData.getValue().getSeat())));

Однако я рекомендую сохранить тип свойства вместо преобразования в String:

@FXML private TableColumn<Player, Number> seatColumn;
seatColumn.setCellValueFactory(cellData -> new SimpleIntegerProperty(cellData.getValue().getSeat()));

Инициализируя cellValueFactory из метода initialize, вы должны удалить создание фабрики из файла fxml, так как только назначенная позже фабрика используется TableView.

person fabian    schedule 30.12.2018