2016-09-24 96 views
0

我有一个FXML文件看起来像这样:FXML的tableview只显示空白行

<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> 

和控制器类是这样的:

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); 
} 

当我运行此,我得到两列(不知道为什么 - 一个被称为“事件名称”,另一个是空白)和两行,但行是空白的。您可以点击行,但其中没有数据。当我从代码中删除“hello”条目或“goodbye”条目时,表格只显示一个空白行而不是两个。

我是新来的Java,并不完全确定为什么会发生这种情况。他们为什么显示行,但数据不显示?

+1

您需要了解如何使用该工具包。由于'String'没有'nameColumnProperty()'或'getNameColumn()'方法,所以如果你在表中的每一行都使用String,那么你的单元格值工厂将不起作用。查看表格视图的教程:很多人喜欢[this one](http://code.makery.ch/library/javafx-8-tutorial/) –

回答

1

使用表的最好方法是使用类来表示表中的数据。在您的示例中,我将字符串更改为TableModel,其中您有一个PropertyString名称问候语。现在你可以很容易地使用这个类来显示tabe中的数据。

控制器:

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>