我在Table View
中有一个FXML
pinTable和两个Table Columns
,即latColumn,longColumn。我已按照以下方法填充表:
https://docs.oracle.com/javafx/2/ui_controls/table-view.htm
摘录如下:
FXML Controller Class:
@FXML
public TableView pinTable;
@FXML
public TableColumn latColumn, longColumn;
public final ObservableList<PinList> dataSource = new FXMLCollections.observableArrayList();
@Override
public void initialize(URL url, ResourceBundle rb)
{
initTable();
}
private void initTable()
{
latColumn.setCellValueFactory(new PropertyValueFactory<PinList,String>("latPin"));
longColumn.setCellValueFactory(new PropertyValueFactory<PinList,String>("longPin"));
pinTable.setItems(dataSource);
}
@FXML
private void addButtonClicked(MouseEvent event)
{
if(latText.getText().equals(""))
{
System.out.println("Lat Empty");
}
else if(longText.getText().equals(""))
{
System.out.println("Long Empty");
}
else
{
latVal = Double.parseDouble(latText.getText());
longVal = Double.parseDouble(longText.getText());
dataSource.add(new PinList(latText.getText(),longText.getText(),descriptionText.getText()));
pinTable.getItems().clear();
pinTable.getItems().addAll(dataSource);
for(PinList p: dataSource)
{
System.out.print(p.getLatPin() + " " + p.getLongPin() + " " + p.getDescriptionPin() + "\n");
}
}
}
我有一个PinList类,如下所示:
public class PinList
{
private final SimpleStringProperty latPin;
private final SimpleStringProperty longPin;
private String descriptionPin;
public PinList(String _latPin, String _longPin, String _descriptionPin)
{
this.latPin = new SimpleStringProperty(_latPin);
this.longPin = new SimpleStringProperty(_longPin);
this.descriptionPin = _descriptionPin;
}
public String getLatPin()
{
return latPin.getValue();
}
public StringProperty latPinProperty()
{
return latPin;
}
public String getLongPin()
{
return longPin.getValue();
}
public StringProperty longPinProperty()
{
return longPin;
}
public String getDescriptionPin()
{
return descriptionPin;
}
}
所有这些看起来都很好。但是,当我点击Add
按钮时,没有任何反应。表中没有创建行,println
事件处理程序中的addButtonClicked
没有执行,或者在dataSource中没有数据执行。任何帮助将不胜感激。
答案 0 :(得分:2)
问题是您将Application
类与FXML控制器类混淆了。即使此FXML类扩展Application
,也不会在代码中的任何位置调用重写的start()
方法。添加一些println
来验证这一点。 FXML控制器类可以选择initialize()
(并且还可以实现Initializable但不是必需的)。 fxml文件加载后,FXMLLoader
将调用此方法。所以正确的代码应该是:
public void initialize( URL url, ResourceBundle rb ) {
initTable();
}
并删除start()方法并从Application中删除扩展。
答案 1 :(得分:1)
使用initTable()
方法
pinTable.setItems(dataSource);
现在,pinTable
属性内部由items
保存的列表与dataSource
列表完全相同(它们的引用相同)。
现在在你的事件处理程序方法中
dataSource.add(new PinList(...));
将新项目添加到dataSource
(与表格items
的列表相同)
然后
pinTable.getItems().clear();
删除表items
列表中的所有元素。因此表items
列表现在为空(没有元素)。当然,由于这与dataSource
完全相同,因此您还删除了dataSource
中的所有项目:它与pinTable.getItems()
相同(现在为空)列表。
现在你做了
pinTable.getItems().addAll(dataSource);
将dataSource
中的所有项目(没有)复制到pinTable.getItems()
(这是相同的列表)。所以这实际上复制了列表中的所有项目,但是由于你清空了列表,你仍然有一个空列表。
只需删除
行pinTable.getItems().clear();
pinTable.getItems().addAll(dataSource);
你想要的只有:
@FXML
private void addButtonClicked(MouseEvent event)
{
if(latText.getText().equals(""))
{
System.out.println("Lat Empty");
}
else if(longText.getText().equals(""))
{
System.out.println("Long Empty");
}
else
{
latVal = Double.parseDouble(latText.getText());
longVal = Double.parseDouble(longText.getText());
dataSource.add(new PinList(latText.getText(),longText.getText(),descriptionText.getText()));
for(PinList p: dataSource)
{
System.out.print(p.getLatPin() + " " + p.getLongPin() + " " + p.getDescriptionPin() + "\n");
}
}
}