fxml tableview 只显示空行

fxml tableview just showing blank rows

我有一个如下所示的 FXML 文件:

<GridPane alignment="CENTER" hgap="10.0" vgap="10.0"
      xmlns:fx="http://javafx.com/fxml"
      fx:controller="GUI.Controller">
<padding>
    <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</padding>

<HBox spacing="10" alignment="bottom_right"
      GridPane.columnIndex="1" GridPane.rowIndex="4">
    <Button text="Sign In"
            onAction="#handleSubmitButtonAction"/>
</HBox>

<TableView fx:id="tableView" GridPane.columnIndex="0" GridPane.rowIndex="0">
    <columns>
        <TableColumn fx:id="nameColumn" text="Event Name">
        </TableColumn>
    </columns>
</TableView>

和这样的控制器 class:

public class Controller implements Initializable {

@FXML
private TableView<String> tableView;

@FXML
private TableColumn<String, String> nameColumn;

@FXML
private ObservableList <String> dataArray;

@Override
public void initialize(URL location, ResourceBundle resources) {


    dataArray = FXCollections.observableArrayList();


    nameColumn.setCellValueFactory(
            new PropertyValueFactory<String, String>("nameColumn")
    );


    dataArray.add("hello");
    dataArray.add("goodbye");


    tableView.setItems(dataArray);
}

当我 运行 这个时,我得到两列(不知道为什么 - 一个叫做 "Event Name" 而另一个是空白)和两行,但是这些行是空白的。您可以单击行,但其中没有数据。当我从代码中删除 "hello" 条目或 "goodbye" 条目时,table 只显示一个空白行而不是两个。

我是 Java 的新手,不确定为什么会这样。为什么它们显示了行,但没有显示数据?

使用 table 的最佳方式是使用 class 表示 table 中的数据。在您的示例中,我将 String 更改为 TableModel,其中您有一个 PropertyString 名称问候语。现在您可以轻松使用此 class 在表格中显示数据。

控制器:

public class Controller implements Initializable {

  @FXML private TableView<TableModel> tableView;

  @FXML private TableColumn<TableModel, String> nameColumn;

  @FXML private ObservableList<TableModel> dataArray;

  @Override public void initialize(URL location, ResourceBundle resources) {

    //add data to Observable List
    dataArray = FXCollections.observableArrayList(new TableModel("hello"), new TableModel("goodbye"));

    //crete one column, name "greetings" is the same name property which is in TableModel
    nameColumn.setCellValueFactory(new PropertyValueFactory<TableModel, String>("greetings"));

    tableView.setItems(dataArray);
  }

  public static class TableModel {

    StringProperty greetings = new SimpleStringProperty();

    public TableModel(String greetings) {
      this.greetings = new SimpleStringProperty(greetings);
    }

    public String getGreetings() {
      return greetings.get();
    }

    public StringProperty greetingsProperty() {
      return greetings;
    }

    public void setGreetings(String greetings) {
      this.greetings.set(greetings);
    }
  }

}

您必须添加此代码才能解决两列的问题。

<columnResizePolicy>
     <TableView fx:constant="CONSTRAINED_RESIZE_POLICY"/>
 </columnResizePolicy>

这是您的 FXML,稍作改动。

<GridPane alignment="CENTER" hgap="10.0" vgap="10.0" xmlns:fx="http://javafx.com/fxml" fx:controller="GUI.Controller">
    <padding>
        <Insets bottom="10.0" left="10.0" right="10.0" top="10.0"/>
    </padding>
    <TableView fx:id="tableView" GridPane.columnIndex="0" GridPane.rowIndex="0">
        <columnResizePolicy>
            <TableView fx:constant="CONSTRAINED_RESIZE_POLICY"/>
        </columnResizePolicy>
        <columns>
            <TableColumn fx:id="nameColumn" text="Event Name"/>
        </columns>
    </TableView>
    <HBox spacing="10" alignment="bottom_right" GridPane.columnIndex="1" GridPane.rowIndex="1">
        <Button text="Sign In" onAction="#handleSubmitButtonAction"/>
    </HBox>
</GridPane>