Bindings.select does not work in JavaFX 2.2 but does in JavaFX 8.0.
Run the following on each and note that Column B only shows data under JavaFX 8.0.
There is no exception reported or any other indication of some internal failure.
package bindingselecttest;
import java.beans.PropertyChangeSupport;
import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.util.Callback;
/**
*
* @author scott.palmer
*/
public class BindingSelectTest extends Application {
@Override
public void start(Stage primaryStage) {
TableView <ClassA> tableView = new TableView<>();
TableColumn<ClassA, String> columnA = new TableColumn<>("Column A");
TableColumn<ClassA, String> columnB = new TableColumn<>("Column B");
tableView.getColumns().add(columnA);
tableView.getColumns().add(columnB);
columnA.setCellValueFactory(new PropertyValueFactory("propA"));
columnB.setCellValueFactory(new BindingsSelectValueFactory(new String[]{"propB","propOfB"}));
columnA.setPrefWidth(100);
columnB.setPrefWidth(100);
for (int i = 0; i < 10.; i++) {
ClassA itemA = new ClassA();
itemA.propA = "Row "+i+"A";
itemA.propB = new ClassB();
itemA.propB.propOfB = "B "+i;
tableView.getItems().add(itemA);
}
StackPane root = new StackPane();
root.getChildren().add(tableView);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Binding.select Test");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
public static class BindingsSelectValueFactory<S, T> implements Callback<TableColumn.CellDataFeatures<S, T>, ObservableValue<T>> {
private final SimpleObjectProperty obj = new SimpleObjectProperty();
private final String [] path;
public BindingsSelectValueFactory(String[] propPath) {
path = propPath;
}
@Override
public ObservableValue<T> call(TableColumn.CellDataFeatures<S, T> p) {
obj.set(p.getValue());
return Bindings.select(obj, path);
}
}
public static class ClassA {
private String propA;
private ClassB propB;
private final transient PropertyChangeSupport propertyChangeSupport = new java.beans.PropertyChangeSupport(this);
public String getPropA() {
return propA;
}
public void setPropA(String propA) {
java.lang.String oldPropA = this.propA;
this.propA = propA;
propertyChangeSupport.firePropertyChange("propA", oldPropA, propA);
}
public ClassB getPropB() {
return propB;
}
public void setPropB(ClassB propB) {
bindingselecttest.BindingSelectTest.ClassB oldPropB = this.propB;
this.propB = propB;
propertyChangeSupport.firePropertyChange("propB", oldPropB, propB);
}
}
public static class ClassB {
private String propOfB;
private final transient PropertyChangeSupport propertyChangeSupport = new java.beans.PropertyChangeSupport(this);
public String getPropOfB() {
return propOfB;
}
public void setPropOfB(String propOfB) {
java.lang.String oldPropOfB = this.propOfB;
this.propOfB = propOfB;
propertyChangeSupport.firePropertyChange("propOfB", oldPropOfB, propOfB);
}
}
}
Run the following on each and note that Column B only shows data under JavaFX 8.0.
There is no exception reported or any other indication of some internal failure.
package bindingselecttest;
import java.beans.PropertyChangeSupport;
import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.util.Callback;
/**
*
* @author scott.palmer
*/
public class BindingSelectTest extends Application {
@Override
public void start(Stage primaryStage) {
TableView <ClassA> tableView = new TableView<>();
TableColumn<ClassA, String> columnA = new TableColumn<>("Column A");
TableColumn<ClassA, String> columnB = new TableColumn<>("Column B");
tableView.getColumns().add(columnA);
tableView.getColumns().add(columnB);
columnA.setCellValueFactory(new PropertyValueFactory("propA"));
columnB.setCellValueFactory(new BindingsSelectValueFactory(new String[]{"propB","propOfB"}));
columnA.setPrefWidth(100);
columnB.setPrefWidth(100);
for (int i = 0; i < 10.; i++) {
ClassA itemA = new ClassA();
itemA.propA = "Row "+i+"A";
itemA.propB = new ClassB();
itemA.propB.propOfB = "B "+i;
tableView.getItems().add(itemA);
}
StackPane root = new StackPane();
root.getChildren().add(tableView);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Binding.select Test");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
public static class BindingsSelectValueFactory<S, T> implements Callback<TableColumn.CellDataFeatures<S, T>, ObservableValue<T>> {
private final SimpleObjectProperty obj = new SimpleObjectProperty();
private final String [] path;
public BindingsSelectValueFactory(String[] propPath) {
path = propPath;
}
@Override
public ObservableValue<T> call(TableColumn.CellDataFeatures<S, T> p) {
obj.set(p.getValue());
return Bindings.select(obj, path);
}
}
public static class ClassA {
private String propA;
private ClassB propB;
private final transient PropertyChangeSupport propertyChangeSupport = new java.beans.PropertyChangeSupport(this);
public String getPropA() {
return propA;
}
public void setPropA(String propA) {
java.lang.String oldPropA = this.propA;
this.propA = propA;
propertyChangeSupport.firePropertyChange("propA", oldPropA, propA);
}
public ClassB getPropB() {
return propB;
}
public void setPropB(ClassB propB) {
bindingselecttest.BindingSelectTest.ClassB oldPropB = this.propB;
this.propB = propB;
propertyChangeSupport.firePropertyChange("propB", oldPropB, propB);
}
}
public static class ClassB {
private String propOfB;
private final transient PropertyChangeSupport propertyChangeSupport = new java.beans.PropertyChangeSupport(this);
public String getPropOfB() {
return propOfB;
}
public void setPropOfB(String propOfB) {
java.lang.String oldPropOfB = this.propOfB;
this.propOfB = propOfB;
propertyChangeSupport.firePropertyChange("propOfB", oldPropOfB, propOfB);
}
}
}
- relates to
-
JDK-8101233 Support standard Java Beans in SelectBinding
-
- Resolved
-