JavaFX-TableView-字段和该字段的字段的更改
我的情况如下。我有一个由模型类Foo中的数据填充的 此类有一个类型为Bar的字段: 其中一列必须显示来自工具栏someText的文本。因此,我将StringProperty绑定到列 但是,当Foo中的整个Bar对象被另一个对象替换时,表也应该更新。因此,我在Foo中创建了一个包含Bar的ObjectProperty,并将该属性绑定到列。当然,现在它再也听不到Bar的someText中的更改了JavaFX-TableView-字段和该字段的字段的更改,java,javafx,javafx-8,Java,Javafx,Javafx 8,我的情况如下。我有一个由模型类Foo中的数据填充的 此类有一个类型为Bar的字段: 其中一列必须显示来自工具栏someText的文本。因此,我将StringProperty绑定到列 但是,当Foo中的整个Bar对象被另一个对象替换时,表也应该更新。因此,我在Foo中创建了一个包含Bar的ObjectProperty,并将该属性绑定到列。当然,现在它再也听不到Bar的someText中的更改了 如何获得这些解决方案的组合,使表同时侦听对象本身及其字段的更改?仅使用JavaFXAPI,您就可以做到这
如何获得这些解决方案的组合,使表同时侦听对象本身及其字段的更改?仅使用JavaFXAPI,您就可以做到这一点
TableColumn<Foo, String> barColumn = new TableColumn<>("Bar");
barColumn.setCellValueFactory(cellData ->
Bindings.selectString(cellData.getValue().barProperty(), "someText"));
它具有编译时检查和类型检查等功能,并且没有虚假的警告。仅使用JavaFXAPI就可以做到这一点
TableColumn<Foo, String> barColumn = new TableColumn<>("Bar");
barColumn.setCellValueFactory(cellData ->
Bindings.selectString(cellData.getValue().barProperty(), "someText"));
它具有编译时检查和类型检查等功能,并且没有虚假警告。您可以使用通过多级层次结构选择值。这允许您创建单个cellValueFactory类: 或
可以使用通过多级层次结构选择值。这允许您创建单个cellValueFactory类: 或
TableColumn<Foo, String> barColumn = new TableColumn<>("Bar");
barColumn.setCellValueFactory(cellData ->
Bindings.selectString(cellData.getValue().barProperty(), "someText"));
barColumns.setCellValueFactory(cellData ->
Val.flatMap(cellData.getValue().barProperty(), Bar::someTextProperty));
import java.util.Arrays;
import javafx.beans.NamedArg;
import javafx.beans.binding.Bindings;
import javafx.beans.value.ObservableValue;
import javafx.scene.control.TableColumn;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.util.Callback;
public class NestedPropertyValueFactory<S, T> implements Callback<TableColumn.CellDataFeatures<S, T>, ObservableValue<T>> {
private final String[] steps;
private final PropertyValueFactory firstStepSelector;
public NestedPropertyValueFactory(String... properties) {
firstStepSelector = new PropertyValueFactory<>(properties[0]);
this.steps = Arrays.copyOfRange(properties, 1, properties.length);
}
/**
* @param property a string containing the names of the properties seperated
* by '.'. (For easy use from fxml file)
*/
public NestedPropertyValueFactory(@NamedArg("property") String property) {
this(property.split("\\."));
}
@Override
public ObservableValue<T> call(TableColumn.CellDataFeatures<S, T> param) {
// use PropertyValueFactory for first step and Bindings.select for
// additonal steps.
return Bindings.select(firstStepSelector.call(param), steps);
}
}
column.setCellValueFactory(new NestedPropertyValueFactory<>("someObject", "someText"));
column.setCellValueFactory(new NestedPropertyValueFactory<>("someObject.someText"));