Java fxml tableview仅显示空行
我有一个FXML文件,如下所示: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
<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.看一看关于表视图的教程:很多人都喜欢