我有一个正在构建的应用程序,其中包含一个表,我没有使用tableview来构建此表,因为我需要每行能够扩展类似于手风琴。我能够通过使用时间轴并循环遍历数据并构建每一行来实现我所需要的(现在它的原始类型,因为我仍在处理虚拟数据,最终它将是一个列表迭代器而不仅仅是for循环)但我对它的完成情况不满意。有很多默认值永远不会改变所以我不需要每次都在我的worker类中设置它们,我决定只将它们添加到我放在一起的对象类中。所以基本上,在高级别它看起来像这样:
for (int i = 0; i < 30; i++) {
RowBuilder builder = new RowBuilder(tableBox, i);
try {
builder.run();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我正在传递它是一个VBox - tableBox的父,然后我传递计数供以后使用。
在RowBuilder中我得到一个对象DashboardRow的新实例,其中设置了所有默认值,然后我为每一行设置数据并返回DashboardRow。
以下是DashboardRow
中的getter设置值的示例public HBox getMainRow() {
mainRow.setAlignment(Pos.CENTER_LEFT);
mainRow.setPrefHeight(60);
mainRow.setMinHeight(60);
mainRow.setMaxHeight(60);
mainRow.setPrefWidth(-1);
mainRow.setStyle("-fx-background-color:#FFFFFF;");
return mainRow;
}
在DashboardRow类中,我为行中需要的每个元素创建了大量新对象。每行有21个,主要是VBox,HBox和StackPane来构建实际的行,其余的只是标签和按钮。
这是迄今为止的样子。开放和关闭的州。
有没有更好的方法在javafx中动态构建这样的东西?我基本上从数据库中提取数据并循环遍历该数据以填充行。
答案 0 :(得分:0)
我无法发表评论,但无论如何它可能都是一个答案。为什么不能使用自定义表格单元格的setGraphic方法并将accordion节点放在表格中。 setGraphic采用任何类型的节点。
这听起来比你正在做的更简单。
我刚用Oracle sample试了一下,效果很好。 我添加了
Callback<TableColumn<Person, String>, TableCell<Person, String>> accCellFactory
= new Callback<TableColumn<Person, String>, TableCell<Person, String>>() {
@Override
public TableCell call(TableColumn p) {
TitledPane t1 = new TitledPane("T1", new Button("B1"));
TitledPane t2 = new TitledPane("T2", new Button("B2"));
TitledPane t3 = new TitledPane("T3", new Button("B3"));
Accordion accordion = new Accordion();
accordion.getPanes().addAll(t1, t2, t3);
TableCell tc = new TableCell();
tc.setGraphic(accordion);
return tc;
}
};
并更改了这一行firstNameCol.setCellFactory(accCellFactory);
我得到了
当然你可能想要除按钮以外的东西,但我只是从javadoc复制了Accordion样本。