我正在尝试获取JFXTreeTableView列以显示文本和图像,同时继续使用树分组功能。
我在演示之后对程序进行了建模,并且能够使基于StringProperty的列正常工作,但现在尝试添加ObjectProperty<Label>
列并不起作用。任何人都可以给我一个使用JFXTreeTableView以及除了主要或字符串以外的任何内容的列的示例(即使用ObjectProperty<?>
的内容)?
编辑:我刚刚通过使用HBox获取了我的图像和文字来显示这一点。
以下是我过去的代码......
在我的单元格对象中:
public final class TestObj extends RecursiveTreeObject<TestObj> {
private final ObjectProperty<HBox> source;
public TestObj(String source) {
ImageView iv = new ImageView();
HBox hbox = new HBox();
hbox.setSpacing(10);
VBox vbox = new VBox();
Label l = new Label(source);
vbox.getChildren().add(l);
iv.setFitHeight(20);
iv.setFitWidth(20);
iv.setImage(new Image("/images/test.png"));
l.setGraphic(iv);
hbox.getChildren().addAll(vbox);
this.source = new SimpleObjectProperty<>(hbox);
}
// ... getters & setters
}
在我的控制器中:
public void initialize(URL location, ResourceBundle resources) {
JFXTreeTableColumn<TestObj, HBox> srcColumn = new JFXTreeTableColumn<>("Source");
srcColumn.setPrefWidth(150);
srcColumn.setCellValueFactory((TreeTableColumn.CellDataFeatures<TestObj, HBox> x) ->
srcColumn.validateValue(x) ? x.getValue().getValue().sourceProperty() : srcColumn.getComputedValue(x));
//... reset of table setup code
}
现在问题是专栏没有正确组合!也就是说:每行的图像和文本可能完全相同,但它不会崩溃到一个组中。相反,它会折叠成许多组,每组只有一个元素。这让我想到表格是如何比较单元格的问题......也许我需要在某处覆盖某个方法?
编辑2 现在,使用下面的代码,可以进行分组,并且可以正确隐藏未分组的节点。此外,应用James_D注释将GUI元素重新定位到数据类之外。目前的问题(在上面的段落中概述)在图2中示出。 A和图乙
数据对象:
public final class TestObj extends RecursiveTreeObject<TestObj> {
//inapplicable vars omitted from this class
//so don't ask why there's just an inner class here ;)
private final ObjectProperty<Register> source;
private final ObjectProperty<Register> destination;
public TestObj(String src, String srcPort, String srcCountry, String dst, String dstPort, String dstCountry) {
this.source = new SimpleObjectProperty<>(new Register(src, srcPort, srcCountry));
this.destination = new SimpleObjectProperty<>(new Register(dst, dstPort, dstCountry));
}
// ... getters & setters
public class Register {
private final String address;
private final String port;
private final String country;
public Register(String address, String port, String country) {
this.address = address;
this.port = port;
this.country = country;
}
//getters ...
}
}
控制器:
public void initialize(URL location, ResourceBundle resources) {
JFXTreeTableColumn<TestObj, TestObj.Register> srcColumn = new JFXTreeTableColumn<>("Source");
srcColumn.setPrefWidth(150); srcColumn.setCellValueFactory((TreeTableColumn.CellDataFeatures<TestObj, TestObj.Register> x) ->
srcColumn.validateValue(x) ? x.getValue().getValue().sourceProperty() : srcColumn.getComputedValue(x));
srcColumn.setCellFactory(new Callback<TreeTableColumn<TestObj, TestObj.Register>, TreeTableCell<TestObj, TestObj.Register>>() {
@Override
public TreeTableCell<TestObj, TestObj.Register> call(TreeTableColumn<TestObj, TestObj.Register> param) {
return new JFXTreeTableCell<TestObj, TestObj.Register>() {
ImageView iv = new ImageView();
@Override
protected void updateItem(TestObj.Register item, boolean empty) {
if(item != null) {
HBox hbox = new HBox();
hbox.setSpacing(10);
VBox vbox = new VBox();
Label l = new Label(item.getAddress() + ":" + item.getPort());
vbox.getChildren().add(l);
iv.setFitHeight(20);
iv.setFitWidth(20);
iv.setImage(new Image("/flags/" + item.getCountry() + ".png"));
l.setGraphic(iv);
hbox.getChildren().addAll(vbox);
setGraphic(hbox);
} else {
setGraphic(null);
}
}
};
}
});
//... above duplicated for dstColumn
//... reset of table setup code
}
图。 A - 展示表格的初始视图(这里一切都很好)
图。 B - 演示错误的分组(每个节点应该有3组)
答案 0 :(得分:0)
经过对JFoenix源码的一些回顾,我意识到幕后没有神奇的比较器...在我的数据对象中我只需要覆盖equals和hashCode方法来考虑复杂的对象&#39; s变量
在这种情况下:
@Override
public boolean equals(Object o) {
if(o == this)
return true;
if(!(o instanceof Register))
return false;
Register r = (Register)o;
return Objects.equals(address, r.address)
&& Objects.equals(port, r.port)
&& Objects.equals(country, r.country);
}
@Override
public int hashCode() {
return Objects.hash(address, port, country);
}