あなた」:以下はの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
で表されます)。デフォルトのソートは、入力したデータに従ってソートされます(列のデータクラスの自然順序は、整数で順序付けされるように定義されています)。