我有一个TableView,看起来如链接图片所示。 click here to see image。目前,我无法对 Vertex ID 列进行排序,但我可以对社区列进行排序。有没有办法根据Vertex ID列对表行进行排序?请建议。下面是tableview和类 TableRow 的代码,它是tableView的数据模型
表格视图代码:
private TableView vertexTable;
List<TableRow> Data = new ArrayList<>();
Data.add(new TableRow(VertexID, color, communityID);
ObservableList<TableRow> obvData = FXCollections.observableArrayList(Data);
vertexTable.setItems(obvData);
TableView中使用的数据模型代码
public class TableRow {
public StringProperty Community = new SimpleStringProperty();
public ObjectProperty Vertex = new SimpleObjectProperty();
private int VertexID ;
public CommunityTableViewRow(String pstrVertexID, Color pclrColor, String pstrCommunity) {
Rectangle rect = new Rectangle(10,5);
rect.setFill(pclrColor);
Group grpShape = new Group(rect);
this.VertexID = Integer.parseInt(pstrVertexID);
Text txtvertex = new Text(pstrVertexID);
HBox hboxVertexID = new HBox(grpShape, txtvertex) ;
hboxVertexID.setSpacing(5);
hboxVertexID.setPadding(new Insets(2,2,2,2));
hboxVertexID.setAlignment(Pos.CENTER_LEFT);
this.Community = new SimpleStringProperty(pstrCommunity);
this.Vertex = new SimpleObjectProperty(hboxVertexID);
}
}
答案 0 :(得分:0)
您将模型与渲染混合:这些应该是分开的。特别是,模型类中应该没有UI元素。
Vertex Id列似乎由两个数据定义:int id和color。所以我首先要创建一个表示它的类。请注意,颜色实际上可能具有更合理的“数据”表示(例如,它可能是表示某些有限选择的枚举:我不知道您在这里建模的是什么。)
由于您希望能够对这些值进行排序,因此您应该使此类实现Comparable<VertexID>
,并将顺序定义为简单为整数定义的顺序。
public class VertexID implements Comparable<VertexID> {
private final int id ;
private final Color color ;
public VertexID(int id, Color color) {
this.id = id ;
this.color = color ;
}
public int getId() {
return id ;
}
public Color getColor() {
return color ;
}
@Override
public int compareTo(VertexID other) {
return Integer.compare(id, other.id);
}
@Override
public boolean equals(Object other) {
if (other == null) return false ;
return (other instanceof VertexID) && ((VertexID)other).id == id ;
}
@Override
public int hashCode() {
return id ;
}
}
现在您的表数据模型应如下所示:
public class TableRow {
private final StringProperty community = new SimpleStringProperty();
private final ObjectProperty<VertexID> vertexId = new SimpleObjectProperty<>();
public TableRow(int vertexId, Color color, String community) {
setVertexId(new VertexID(vertexId, color));
setCommunity(community);
}
public StringProperty communityProperty() {
return community ;
}
public final String getCommunity() {
return communityProperty().get();
}
public final void setCommunity(String community) {
communityProperty().set(community);
}
public ObjectProperty<VertexID> vertexIdProperty() {
return vertexId ;
}
public final VertexID getVertexId() {
return vertexIdProperty().get();
}
public final void setVertexId(VertexID vertexId) {
vertexIdProperty().set(vertexId);
}
public final void setVertexId(int vertexId, Color color) {
vertexIdProperty().set(new VertexID(vertexId, color));
}
}
现在您设置表格视图。请注意,顶点id列的显示由cellFactory
(不 cellValueFactory
)控制:
TableView<TableRow> table = new TableView<>();
TableColumn<TableRow, String> communityColumn = new TableColumn<>("Community");
communityColumn.setCellValueFactory(cellData -> cellData.getValue().communityProperty());
TableColumn<TableRow, VertexID> vertexIdColumn = new TableColumn<>("Vertex IDs");
vertexIdColumn.setCellValueFactory(cellData -> cellData.getValue().vertexIdProperty());
vertexIdColumn.setCellFactory(tc -> new TableCell<TableRow, VertexID>() {
private Rectangle rect = new Rectangle(10, 5);
private Group grpShape = new Group(rect);
private Text textVertex = new Text();
private HBox hbox = new HBox(5, grpShape, textVertex);
{
hbox.setPadding(new Insets(2,2,2,2));
hbox.setAlignment(Pos.CENTER_LEFT);
}
@Override
protected void updateItem(VertexID vertex, boolean empty) {
super.updateItem(vertex, empty);
if (empty) {
setGraphic(null);
} else {
textVertex.setText(Integer.toString(vertex.getId()));
rect.setFill(vertex.getColor());
setGraphic(hbox);
}
}
});
这提供了数据(由列cellValue
s表示)与这些数据的表示的正确分离(由列{{表示) 1}}为s)。现在默认排序是有效的,因为它根据您提供的数据进行排序(列的数据类的自然顺序cell
被定义为按整数排序)。