2017-05-17 12 views
0

リンクされた画像のように見えるTableViewがあります。 click here to see image。現在、頂点IDの列はソートできませんが、コミュニティ列を並べ替えることができます。頂点ID列に基づいてテーブル行をソートする方法はありますか?提案してください。HBoxの一部であるJavaFXの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); 

データモデルのコードテーブルビュー

で使用する
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

あなた」:以下はのtableView

表コードの表示のためのデータモデルがされてテーブルビューとクラスのTableRowためのコードがありますモデルとレンダリングを再ミックスします。これらは別々にする必要があります。特に、モデルクラスにはUI要素を持たないようにしてください。

Vertex Id列は、int idとcolorという2つのデータによって定義されているようです。だから私はそれを表現するクラスを作成することから始めます。色は実際にはより賢明な「データ」表現を持つかもしれないことに注意してください(例えば、何かの有限の選択肢を表す列挙型かもしれません:あなたがここでモデリングしているものはわかりません)。

これらの値を並べ替えることができるようにするために、このクラスにComparable<VertexID>を実装させ、単純に整数で定義された順序になるように順序を定義する必要があります。今、あなたはあなたのテーブルビューを上に設定

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)); 
    } 
} 

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 ; 
    } 
} 

今、あなたのテーブルのデータモデルは次のようになります。頂点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によって表される)データの適切な分離を提供しますこれらのデータのプレゼンテーション(列のcellで表されます)。デフォルトのソートは、入力したデータに従ってソートされます(列のデータクラスの自然順序は、整数で順序付けされるように定義されています)。