首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从嵌套TableColumn访问父值

如何从嵌套TableColumn访问父值
EN

Stack Overflow用户
提问于 2020-06-30 08:51:32
回答 1查看 164关注 0票数 0

我有一个表(TableView),其中经常重复一组列(例如,姓名和地址)。我将这些列分组为公共列的子列。

代码语言:javascript
复制
<TableColumn text="Получател">
    <columns>
        <TableColumn text="ЕИК"/>
        <TableColumn text="ЗДДС №"/>
        <TableColumn text="Име"/>
        <TableColumn text="Адрес"/>
        <TableColumn text="Материално отговорно лице"/>
        <TableColumn text="Получател"/>
    </columns>
</TableColumn>

我将这组列导出到用户控件。

代码语言:javascript
复制
<fx:root type="com.example.CompanyTableColumn" xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml"
         text="${controller.name}">

    <columns>
        <TableColumn fx:id="eikColumn" text="ЕИК"/>
        <TableColumn fx:id="vatColumn" text="ЗДДС №"/>
        <TableColumn fx:id="nameColumn" text="Име"/>
        <TableColumn fx:id="addressColumn" text="Адрес"/>
        <TableColumn text="Материално отговорно лице"/>
    </columns>

</fx:root>
代码语言:javascript
复制
public class CompanyTableColumn extends TableColumn<Invoice, Company> {

    @FXML
    private TableColumn<Invoice, String> eikColumn;

    @FXML
    private TableColumn<Invoice, String> vatColumn;

    @FXML
    private TableColumn<Invoice, String> nameColumn;

    @FXML
    private TableColumn<Invoice, String> addressColumn;

    private StringProperty name = new SimpleStringProperty();

    public CompanyTableColumn() {
        try {
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(getClass().getResource("/com/example/table_column_company.fxml"));
            loader.setRoot(this);
            loader.setController(this);

            loader.load();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }

    @FXML
    private void initialize() {
        
    }

    public String getName() {
        return name.get();
    }

    public StringProperty nameProperty() {
        return name;
    }

    public void setName(String name) {
        this.name.set(name);
    }
}

初始化用户控件,如下所示

代码语言:javascript
复制
<TableView fx:id="tableView">
    <columns>
        <CompanyTableColumn fx:id="supplierColumn" name="Доставчик"/>
        <CompanyTableColumn fx:id="receiverColumn" name="Получател"/>
    <columns>
</TableView>
代码语言:javascript
复制
supplierColumn.setCellValueFactory(cdf -> new SimpleObjectProperty<>(cdf.getValue().getSupplier()));
receiverColumn.setCellValueFactory(cdf -> new SimpleObjectProperty<>(cdf.getValue().getReceiver()));

我的问题来了。在本例中,两个控件必须可视化来自Company模型不同实例的数据。我通过创建一个CellValueFactory来提交各种实例,但是我不知道如何访问CompanyTableColumn中的特定值,所以我可以在创建嵌套列值的工厂中使用它。

编辑

与往常一样,问题提出后不久就找到了解决办法:

代码语言:javascript
复制
@FXML
private void initialize() {
    eikColumn.setCellValueFactory(cdf -> new SimpleStringProperty(getCellObservableValue(cdf.getValue()).getValue().getEik()));
    vatColumn.setCellValueFactory(cdf -> new SimpleStringProperty(getCellObservableValue(cdf.getValue()).getValue().getVat()));
    nameColumn.setCellValueFactory(cdf -> new SimpleStringProperty(getCellObservableValue(cdf.getValue()).getValue().getName()));
    addressColumn.setCellValueFactory(cdf -> new SimpleStringProperty(getCellObservableValue(cdf.getValue()).getValue().getAddress()));
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-30 12:17:31

我找到的解决方案包括使用与表中相应行对应的值作为参数调用TableColumn::getCellObservableValue (由回调函数中的CellDataFeatures对象返回以生成值)。

代码语言:javascript
复制
public class CompanyTableColumn extends TableColumn<Invoice, Company> {

    @FXML
    private TableColumn<Invoice, String> eikColumn;

    @FXML
    private TableColumn<Invoice, String> vatColumn;

    @FXML
    private TableColumn<Invoice, String> nameColumn;

    @FXML
    private TableColumn<Invoice, String> addressColumn;

    private StringProperty name = new SimpleStringProperty();

    public CompanyTableColumn() {
        try {
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(getClass().getResource("/com/example/table_column_company.fxml"));
            loader.setRoot(this);
            loader.setController(this);

            loader.load();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }

    @FXML
    private void initialize() {
        eikColumn.setCellValueFactory(cdf -> new SimpleStringProperty(getCellObservableValue(cdf.getValue()).getValue().getEik()));
        vatColumn.setCellValueFactory(cdf -> new SimpleStringProperty(getCellObservableValue(cdf.getValue()).getValue().getVat()));
        nameColumn.setCellValueFactory(cdf -> new SimpleStringProperty(getCellObservableValue(cdf.getValue()).getValue().getName()));
        addressColumn.setCellValueFactory(cdf -> new SimpleStringProperty(getCellObservableValue(cdf.getValue()).getValue().getAddress()));
    }

    public String getName() {
        return name.get();
    }

    public StringProperty nameProperty() {
        return name;
    }

    public void setName(String name) {
        this.name.set(name);
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62653690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档