У меня есть простой класс модели Person, и я использую его для заполнения TreeTableView.Я хочу иметь один столбец с флажком и хочу заполнить другой TreeTableView данными, которые я проверяю в первой таблице.Кажется разумным, но моя проблема в том, что ChangeListener, добавленный в BooleanProperty через SetCellValueFactory, запускается много раз, от 4 до 8 раз случайно (или, как мне кажется, случайно, я не проверял это на самом деле).
Основной класс:
import javafx.application.Application;
import javafx.beans.property.BooleanProperty;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeTableColumn;
import javafx.scene.control.TreeTableView;
import javafx.scene.control.cell.CheckBoxTreeTableCell;
import javafx.scene.control.cell.TreeItemPropertyValueFactory;
import javafx.stage.Stage;
public class ChangeListenerBug extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) throws Exception {
// create the treeTableView and colums
TreeTableView<Person> ttv = new TreeTableView<Person>();
TreeTableColumn<Person, String> colName = new TreeTableColumn<>("Name");
TreeTableColumn<Person, Boolean> colSelected = new TreeTableColumn<>("Selected");
ttv.getColumns().add(colName);
ttv.getColumns().add(colSelected);
ttv.setShowRoot(false);
ttv.setEditable(true);
colSelected.setEditable(true);
// set the columns
colName.setCellValueFactory(new TreeItemPropertyValueFactory<>("name"));
colSelected.setCellFactory(CheckBoxTreeTableCell.forTreeTableColumn(colSelected));
colSelected.setCellValueFactory(cellData -> {
// binding the cell property with the model
BooleanProperty selected = cellData.getValue().getValue().selectedProperty();
// listening for a change in the property
selected.addListener((obs, oldVal, newVal) -> {
System.out.println(newVal);// WHY IS THIS GETTING CALLED MULTIPLE TIMES
});
return selected;
});
// creating treeItems to populate the treetableview
TreeItem<Person> rootTreeItem = new TreeItem<Person>();
rootTreeItem.getChildren().add(new TreeItem<Person>(new Person("Name 1")));
rootTreeItem.getChildren().add(new TreeItem<Person>(new Person("Name 2")));
ttv.setRoot(rootTreeItem);
// build and show the window
Group root = new Group();
root.getChildren().add(ttv);
stage.setScene(new Scene(root, 300, 300));
stage.show();
}
}
Персона Класс:
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
public class Person {
private StringProperty name;
private BooleanProperty selected;
public Person(String name) {
this.name = new SimpleStringProperty(name);
selected = new SimpleBooleanProperty(false);
}
public StringProperty nameProperty() {return name;}
public BooleanProperty selectedProperty() {return selected;}
public void setName(String name){this.name.set(name);}
public void setSelected(boolean selected){this.selected.set(selected);}
}
Вывод, когда я отмечаю флажок (то же самое, но ложь, когда я отменяю выбор):
true
true
true
true
true