2016-12-01 7 views
0

Что я пытаюсь сделать, это скопировать выбранную строку в один TableView в другой TableView.JavaFX передает данные из одного 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 является TableView, colName2, и т.д. TableColumns

Проблема заключается в том, что приложение работает не правильно. Сначала я должен нажать кнопку, связанную с этим методом, а затем, после выбора строки в TableView 1, я получаю в TableView 2. Что еще, я могу щелкнуть несколько других строк, и они тоже будут добавлены. Подобно этой кнопке эта опция выбора и я хочу просто выбрать строку, нажать кнопку, увидеть эту строку в другом TableView. Затем я хочу выбрать еще один, снова нажать кнопку и т. Д.

Следующая проблема заключается в том, что, как только я снова нажимаю кнопку, она очищает второй TableView и теперь добавляет выбранные элементы дважды, если я снова нажимаю кнопку , он снова очищает TableView и теперь добавляет выделенный элемент 3 раза и т. д.

ответ

0

Что здесь происходит, так это то, что вы не добавляете прослушиватель перед нажатием кнопки. Когда кнопка нажата в первый раз, это не вызывает слушателя. Только позже, когда вы измените выбор, будет отправлено уведомление о списке. При нажатии кнопки второй раз добавляется еще один прослушиватель, который делает то же самое, что и первый слушатель. Поэтому код слушателей будет выполнен дважды. Нажатие кнопки 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())); 
    } 
} 
Смежные вопросы