JavaFX将数据从一个TableView传递到另一个

时间:2016-12-01 22:19:53

标签: javafx tableview

我想要做的是将一个TableView中的选定行复制到另一个TableView。

 public void addMeal()
{
    products2 = FXCollections.observableArrayList();
    tableProduct.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<productData>() {
        @Override
        public void changed(ObservableValue<? extends productData> observable, productData oldValue, productData newValue) {
            products2.add(new productData(newValue.getName(), newValue.getKcal(), newValue.getProtein(), newValue.getCarb(), newValue.getFat()));
        }
    });
    colProduct2.setCellValueFactory(new PropertyValueFactory<productData, String>("name"));
    colKcal2.setCellValueFactory(new PropertyValueFactory<productData, String>("kcal"));
    colProtein2.setCellValueFactory(new PropertyValueFactory<productData, String>("protein"));
    colCarbs2.setCellValueFactory(new PropertyValueFactory<productData, String>("carb"));
    colFat2.setCellValueFactory(new PropertyValueFactory<productData, String>("fat"));
    tableProduct2.setItems(products2);
}

products2是ObservableList, tableProduct2是TableView, colName2等是TableColumns

问题是,app工作不正常。我必须首先按下与此方法连接的按钮,然后在TableView 1中选择行后,我进入TableView 2.更重要的是,我可以点击其他几行,它们也将被添加。它就像这个按钮启用这个选择选项,我想要的只是选择行,单击按钮,在另一个TableView中查看此行。然后我想选择另一个,再次单击按钮等。

接下来的问题是,一旦我再次单击按钮,它将清除第二个TableView,从现在开始,他将添加两次所选项目,如果我再次单击按钮,它会再次清除TableView,现在它将所选项目添加3次,等等......

1 个答案:

答案 0 :(得分:0)

这里发生的是在单击按钮之前不添加侦听器。第一次单击该按钮时,这不会触发侦听器。只有在您更改选择后,才会通知listnener。通过再次单击该按钮,将添加另一个侦听器,该侦听器与第一个侦听器正在执行的操作相同。因此,侦听器代码将执行两次。单击第3,第4,第5等按钮。时间将为属性添加越来越多的侦听器,这些侦听器将在更改属性时触发。

单击该按钮即可删除列表内容,因为您将旧items列表替换为新的空列表。

要简单地将所选项目添加到另一个表格,只需将所选项目添加到该表格即可;没有听众需要。

设置cellValueFactory应该在initialize方法或fxml文件中完成:

@FXML
private void initialize() {
    colProduct2.setCellValueFactory(new PropertyValueFactory<productData, String>("name"));
    colKcal2.setCellValueFactory(new PropertyValueFactory<productData, String>("kcal"));
    colProtein2.setCellValueFactory(new PropertyValueFactory<productData, String>("protein"));
    colCarbs2.setCellValueFactory(new PropertyValueFactory<productData, String>("carb"));
    colFat2.setCellValueFactory(new PropertyValueFactory<productData, String>("fat"));
}

public void addMeal() {
    productData selection = tableProduct.getSelectionModel().getSelectedItem();

    if (selection != null) {
        // are you sure this needs to be copied???
        tableProduct2.getItems().add(new productData(selection.getName(), selection.getKcal(), selection.getProtein(), selection.getCarb(), selection.getFat()));
    }
}