Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX-TableView-字段和该字段的字段的更改_Java_Javafx_Javafx 8 - Fatal编程技术网

JavaFX-TableView-字段和该字段的字段的更改

JavaFX-TableView-字段和该字段的字段的更改,java,javafx,javafx-8,Java,Javafx,Javafx 8,我的情况如下。我有一个由模型类Foo中的数据填充的 此类有一个类型为Bar的字段: 其中一列必须显示来自工具栏someText的文本。因此,我将StringProperty绑定到列 但是,当Foo中的整个Bar对象被另一个对象替换时,表也应该更新。因此,我在Foo中创建了一个包含Bar的ObjectProperty,并将该属性绑定到列。当然,现在它再也听不到Bar的someText中的更改了 如何获得这些解决方案的组合,使表同时侦听对象本身及其字段的更改?仅使用JavaFXAPI,您就可以做到这

我的情况如下。我有一个由模型类Foo中的数据填充的

此类有一个类型为Bar的字段:

其中一列必须显示来自工具栏someText的文本。因此,我将StringProperty绑定到列

但是,当Foo中的整个Bar对象被另一个对象替换时,表也应该更新。因此,我在Foo中创建了一个包含Bar的ObjectProperty,并将该属性绑定到列。当然,现在它再也听不到Bar的someText中的更改了


如何获得这些解决方案的组合,使表同时侦听对象本身及其字段的更改?

仅使用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"));