如何显示在JavaFX TableView中继承的对象

时间:2016-01-26 09:06:38

标签: java inheritance javafx tableview

Hy all!

我在寻找如何在Tableview属性中显示从父对象继承的对象。

让我解释一下:

  • 我有两种类型的对象B和C继承了A类对象。

  • A具有属性a1

  • B具有属性b1
  • C具有属性c1

我想在TableView中显示a1,b1 c1,我有一个对象列表,可以是A,B或C类型。

目前我声明我的tableView如下:

TableView<A> table;

ListProperty<A> list = new SimpleListProperty<>();

TableColumn<A, a1> column_a1 = new TableColumn<A, a1>("a1 property");
column_a1.setCellValueFactory(new PropertyValueFactory<A, a1>("a1"));

TableColumn<B, b1> column_b1 = new TableColumn<B, b1>("b1 property");
column_b1.setCellValueFactory(new PropertyValueFactory<B, a1>("b1"));

TableColumn<C, c1> column_c1 = new TableColumn<C, c1>("c1 property");
column_c1.setCellValueFactory(new PropertyValueFactory<C, c1>("c1"));

table.getColumns().add((TableColumn<A, a1>) column_a1);
table.getColumns().add((TableColumn<B, b1>) column_b1);
table.getColumns().add((TableColumn<C, c1>) column_c1);

table.setItems((ObservableList<A>) list);

在此配置中,对于表的每一行,只有一列必须为非空。

但是在向表中添加列时出现错误。

我说了我的表:TableView表 但显然我不能添加B和C列,因为这些类型继承了A。

我的问题是:如何在JavaFX中查看继承表的声明类型的对象属性?

我当然想把我的tableView声明为: TableView表,但这不能让我满意。

还有其他办法吗?

编辑评论工作中的解决方案,但我还有其他问题。 在我的例子中,B和C类的属性具有相同的名称。 所以当我设置PropertyValueFactory时,我写道:

TableView<A> table;

TableColumn<A, a1> column_a1 = new TableColumn<A, a1>("a1 property");
column_a1.setCellValueFactory(new PropertyValueFactory<A, a1>("a1"));

TableColumn<B, b1> column_b1 = new TableColumn<A, b1>("b1 property");
column_b1.setCellValueFactory(new PropertyValueFactory<A, b1>("sameNameOfProperty"));

TableColumn<C, c1> column_c1 = new TableColumn<A, c1>("c1 property");
column_c1.setCellValueFactory(new PropertyValueFactory<A, c1>("sameNameOfProperty"));

table.getColumns().add((TableColumn<A, a1>) column_a1);
table.getColumns().add((TableColumn<A, b1>) column_b1);
table.getColumns().add((TableColumn<A, c1>) column_c1);

table.setItems((ObservableList<A>) list)

由于我使用类型参数A声明所有列和属性,因此属性名称相同,当我在TableView中添加B或C对象时,为B或C对象的每一行设置两列b1和c1

1 个答案:

答案 0 :(得分:2)

我找到了一个针对b1和c1属性的ObservableValue实现的答案。这给出了这样的东西:

TableView<A> table;

TableColumn<A, a1> column_a1 = new TableColumn<A, a1>("a1 property");
column_a1.setCellValueFactory(new PropertyValueFactory<A, a1>("a1"));

TableColumn<A, b1> column_b1 = new TableColumn<A, b1>("b1 property");

column_b1.setCellValueFactory(new Callback<CellDataFeatures<A, b1>, ObservableValue<b1>>() {
    public ObservableValue<b1> call(CellDataFeatures<A, b1> p) {
        if(p.getValue() instanceof B){
            return new ObservableValue<B.b1>() {
                @Override
                public void removeListener(InvalidationListener arg0) {}
                @Override
                public void addListener(InvalidationListener arg0) {}
                @Override
                public void removeListener(ChangeListener<? super b1> listener) {}

                @Override
                public b1 getValue() {
                    return ((B)p.getValue()).getSameNameOfProperty();
                }

                @Override
                public void addListener(ChangeListener<? super b1> listener) {}
                };
            }
        return null;
        }
    });

TableColumn<A, c1> column_c1 = new TableColumn<A, c1>("c1 property");

column_c1.setCellValueFactory(new Callback<CellDataFeatures<A, c1>, ObservableValue<c1>>() {
    public ObservableValue<c1> call(CellDataFeatures<A, c1> p) {
        if(p.getValue() instanceof C){
            return new ObservableValue<C.c1>() {
                @Override
                public void removeListener(InvalidationListener arg0) {}
                @Override
                public void addListener(InvalidationListener arg0) {}
                @Override
                public void removeListener(ChangeListener<? super c1> listener) {}

                @Override
                public c1 getValue() {
                    return ((C)p.getValue()).getSameNameOfProperty();
                }

                @Override
                public void addListener(ChangeListener<? super c1> listener) {}
            };
        }
        return null;
        }
   });
table.getColumns().add((TableColumn<A, a1>) column_a1);
table.getColumns().add((TableColumn<A, b1>) column_b1);
table.getColumns().add((TableColumn<A, c1>) column_c1);

table.setItems((ObservableList<A>) list);

因此,添加一种对象a,b或c只会填充相应的列。 我仍然需要检查按类型输入的信息,但这是另一个故事。

感谢您的回答!