2016-12-01 17 views
0

何をしようとしているのは、あるTableViewの選択された行を別のTableViewにコピーすることです。JavaFXがある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); 
} 

製品2はObservableList、 tableProduct2はテーブルビュー、 colName2である、などである

問題はアプリが正しくない働いている、ということであるこのtableColumnsです。私はこのメソッドで最初に接続されたボタンを押して、次にTableView 1で行を選択した後にTableView 2に入ります。何が他の行をクリックすることもできますが、それらも追加されます。このボタンのようにこの選択オプションが有効になり、私は単に行を選択し、ボタンをクリックして、別のTableViewでこの行を見たいだけです。次に別のボタンをクリックします。

次の問題は、もう一度ボタンをクリックすると、2番目のTableViewをクリアしてから、もう一度ボタンをクリックすると、選択した項目を2回追加します。それは再びTableViewをクリアし、選択した項目を3回追加します。

答えて

0

ボタンがクリックされる前にリスナーを追加しないでください。ボタンを初めてクリックすると、リスナーがトリガーされません。後で選択を変更したときにのみ、リスナーに通知されます。ボタンをもう一度クリックすることにより、第1のリスナが行っているのと同じことをする別のリスナが追加される。したがって、リスナーコードは2回実行されます。 3番目、4番目、5番目のボタンをクリックします。時間は、プロパティの変更ですべてトリガーされるプロパティにますます多くのリスナーを追加します。

古いitemsリストを新しい空のリストに置き換えるため、リストの内容はボタンをクリックすると削除されます。

選択した項目を他の表に追加するだけで、選択した項目をその表に追加するだけで十分です。リスナーは必要ありません。

@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())); 
    } 
} 
cellValueFactoryinitialize方法やFXMLファイルで行われるべき設定

関連する問題