TableColumn 不显示值 (JavaFX 11)
TableColumn doesn't display values (JavaFX 11)
我制作了包含两列的 TableView - 首先从通过选择模型从其他 TableView 导入的列表中分配给 class 的值,第二个分配给 class 的某个值。但是第二列仍然是空的。
我正在设置一个 TableView,其中包含玩家的昵称 (String) 和他的座位 (int)。我在 Hibernate 从 SQL table 生成的主控件 TableView 中生成。从 SQL table 导入的玩家值由 @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>
Class玩家:
@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.imgur.com/oyJ3rQ5.png
我尝试用 seatColumn.setCellValueFactory([lambda]) 和 setCellValue([lambda]) 做一些事情,但我的所有尝试都失败了。
您使用了错误的 SimpleStringProperty
构造函数用于预期目的:
SimpleStringProperty(Object bean, String name)
只接收"metadata"关于属性,但实际上并没有初始化值:
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
使用稍后分配的工厂。
我制作了包含两列的 TableView - 首先从通过选择模型从其他 TableView 导入的列表中分配给 class 的值,第二个分配给 class 的某个值。但是第二列仍然是空的。
我正在设置一个 TableView,其中包含玩家的昵称 (String) 和他的座位 (int)。我在 Hibernate 从 SQL table 生成的主控件 TableView 中生成。从 SQL table 导入的玩家值由 @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>
Class玩家:
@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.imgur.com/oyJ3rQ5.png
我尝试用 seatColumn.setCellValueFactory([lambda]) 和 setCellValue([lambda]) 做一些事情,但我的所有尝试都失败了。
您使用了错误的 SimpleStringProperty
构造函数用于预期目的:
SimpleStringProperty(Object bean, String name)
只接收"metadata"关于属性,但实际上并没有初始化值:
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
使用稍后分配的工厂。