TableColumn 不显示值 (JavaFX 11)



我用两列创建了TableView,第一列分配给通过选择模型从其他TableView导入的List中的类的值,第二列分配给该类的某个值。但第二列仍然是空的。

我正在设置一个TableView,其中包含Player的昵称(String)和他的座位(int)。我在主控中生成了TableView,它是Hibernate从SQL表中生成的。从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文件(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;
}
}

Getter和setter是默认的(由lombok创建,但不在乎)。

此控制器的启动是由以下原因引起的:

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

在主控制器中正确选择后,单击按钮"Run!"。

https://i.stack.imgur.com/upned.png

我试着用seatColumn.setCellValueFactory([lambda])和setCellValue([lambda])做一些事情,但所有的尝试都失败了。

您为预期目的使用了错误的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()));

initialize方法初始化cellValueFactory时,应该从fxml文件中删除工厂的创建,因为TableView只使用稍后指定的工厂。

最新更新