簡體   English   中英

TableColumn不顯示值(JavaFX 11)

[英]TableColumn doesn't display values (JavaFX 11)

我用兩列制作了TableView-首先分配給通過選擇模型從其他TableView導入的List中的類中的值,其次分配給該類的某個值。 但是第二列仍然保持空白。

我正在設置一個TableView,其中包含玩家的昵稱(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);

正確選擇后,在主控制器中單擊“運行!”按鈕。

https://i.imgur.com/oyJ3rQ5.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僅使用稍后分配的工廠。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM