Я сделал TableView с двумя столбцами - первый присваивается значению из класса из списка, импортированного из другого TableView через модель выбора, второй присваивается некоторому значению класса.Но второй столбец все еще остается пустым.
Я настраиваю TableView, который содержит ник игрока (String) и его место (int).Я сгенерировал в главном контроллере TableView, который был сгенерирован из таблицы SQL Hibernate.Значения проигрывателя, импортированные из таблицы SQL, аннотируются @Column, значение 'seat' имеет аннотацию @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 (seat.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;
}
}
По умолчанию используются геттеры и сеттеры (созданные lombok, но это не важно).
Запуск этого контроллера вызван:
SeatsController seatsController = fxmlLoader.getController();
seatsController.manageSeats(selectedPlayers);
в главном контроллере после правильного выбора инажмите на кнопку «Выполнить!».
https://i.imgur.com/oyJ3rQ5.png
Я пытаюсь что-то сделать с помощью seatColumn.setCellValueFactory ([lambda]) и setCellValue ([lambda]), но все мои попыткипотерпеть неудачу.