项目未在JavaFX中的TableView中显示

时间:2016-01-05 21:46:01

标签: java javafx fxml

我在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中没有数据执行。任何帮助将不胜感激。

2 个答案:

答案 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");
        }
    }
}