有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java TableColumn不显示值(JavaFX11)

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

我正在设置一个包含玩家昵称(String)和座位(int)的TableView。我在主控件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);

选择正确后,在主控制器中单击“运行”按钮

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

我试着用seatColumn做点什么。setCellValueFactory([lambda])和setCellValue([lambda]),但我所有的尝试都失败了


共 (1) 个答案

  1. # 1 楼答案

    您使用了错误的SimpleStringProperty构造函数来达到预期目的:

    SimpleStringProperty​(Object bean, String name)只接收有关属性的“元数据”,但不实际初始化值:

    • bean是包含属性的对象
    • name是一个包含属性名称的字符串

    两者都用于为property对象指定同名的属性

    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只使用后来分配的工厂