Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java fxml tableview仅显示空行_Java_Javafx_Fxml - Fatal编程技术网

Java fxml tableview仅显示空行

Java fxml tableview仅显示空行,java,javafx,fxml,Java,Javafx,Fxml,我有一个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" /> </padd

我有一个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>
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);
}

还有这样一个控制器类:

<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);
}
公共类控制器实现可初始化{
@FXML
私有TableView TableView;
@FXML
私有表列名称列;
@FXML
私有可观测列表数据数组;
@凌驾
公共void初始化(URL位置、ResourceBundle资源){
dataArray=FXCollections.observableArrayList();
nameColumn.setCellValueFactory(
新PropertyValueFactory(“名称列”)
);
dataArray.add(“hello”);
dataArray.add(“再见”);
setItems(数据数组);
}
当我运行此程序时,我得到两列(不确定为什么-一列称为“事件名称”,另一行为空)和两行,但行是空的。您可以单击行,但其中没有数据。当我从代码中删除“hello”项或“再见”项时,表只显示一行而不是两行


我是Java新手,不太清楚为什么会发生这种情况。为什么会显示行,但不显示数据?

使用table的最佳方法是使用class来表示表中的数据。在您的示例中,我将String改为TableModel,其中有一个PropertyString名称。现在您可以轻松地使用此类在ta中显示数据是

控制器:

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

}
公共类控制器实现可初始化{
@FXML私有表视图表视图;
@FXML私有表列名称列;
@FXML私有可观测列表数据数组;
@重写公共void初始化(URL位置、ResourceBundle资源){
//将数据添加到可观察列表
dataArray=FXCollections.observearraylist(newtablemodel(“hello”)、newtablemodel(“再见”);
//在一列中,名称“问候语”与TableModel中的名称属性相同
nameColumn.setCellValueFactory(新属性ValueFactory(“问候”);
setItems(数据数组);
}
公共静态类表模型{
StringProperty问候语=新的SimpleStringProperty();
公共表模型(字符串问候语){
this.greetings=新的SimpleStringProperty(问候语);
}
公共字符串getGreetings(){
回敬问候。get();
}
公共字符串属性问候属性(){
问候;
}
公共问候语(字符串问候语){
本.问候语.集(问候语);
}
}
}
必须添加此代码才能解决两列的问题

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

使用table的最佳方法是使用class来表示table中的数据。在您的示例中,我将String更改为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);
    }
  }

}
公共类控制器实现可初始化{
@FXML私有表视图表视图;
@FXML私有表列名称列;
@FXML私有可观测列表数据数组;
@重写公共void初始化(URL位置、ResourceBundle资源){
//将数据添加到可观察列表
dataArray=FXCollections.observearraylist(newtablemodel(“hello”)、newtablemodel(“再见”);
//在一列中,名称“问候语”与TableModel中的名称属性相同
nameColumn.setCellValueFactory(新属性ValueFactory(“问候”);
setItems(数据数组);
}
公共静态类表模型{
StringProperty问候语=新的SimpleStringProperty();
公共表模型(字符串问候语){
this.greetings=新的SimpleStringProperty(问候语);
}
公共字符串getGreetings(){
回敬问候。get();
}
公共字符串属性问候属性(){
问候;
}
公共问候语(字符串问候语){
本.问候语.集(问候语);
}
}
}
必须添加此代码才能解决两列的问题

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


您需要学习如何使用工具箱。如果您对表中的每一行使用
String
s,则单元格值工厂将不起作用,因为
String
没有
nameColumnProperty()
getNameColumn()
method。查看有关表视图的教程:像您这样的许多人都需要学习如何使用工具箱。如果您对表中的每一行使用
String
s,则单元格值工厂将不起作用,因为
String
没有
nameColumnProperty()
getNameColumn()
method.看一看关于表视图的教程:很多人都喜欢