在JavaFX中对TableView列项进行排序,它是HBox的一部分

时间:2017-05-17 21:47:35

标签: javafx javafx-8

我有一个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);
}
}

1 个答案:

答案 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被定义为按整数排序)。