<AI>
JavaFXの TableView で特定行のデータを書き換えて変更を検知させ、セルの値に応じて動的に文字色を変更するには、
以下の手順に従って実装します。
1). モデルクラスで Property (例: StringProperty, IntegerProperty) を使用する。
2). 対象カラムの setCellFactory で文字色(setTextFill)を変更する条件を記述する。
3). 行データを更新する際、該当プロパティの値を直接書き換える。
以下に、対象カラムの文字色を条件に合わせて変更する実装例を解説します。
1. モデルクラスの設計(Propertyを使用)
行のデータクラス(Bean)は、通常のフィールド(String, int など)の代わりに Property を使用して定義します。
これにより、値の変更がJavaFXに伝播します。
java
public class MyData {
private final StringProperty name;
private final StringProperty status; // 色の条件にするプロパティ
public MyData(String name, String status) {
this.name = new SimpleStringProperty(name);
this.status = new SimpleStringProperty(status);
}
public StringProperty statusProperty() {
return status;
}
public String getStatus() {
return status.get();
}
public void setStatus(String status) {
this.status.set(status);
}
// 他のGetter/Setter
}
2. TableView と CellFactory の設定
対象カラム(この例では status カラム)に対して setCellFactory を設定し、
セルの値(または行の値)に応じて文字色を指定するコールバックを実装します。
java
TableColumn statusColumn = new TableColumn<>("ステータス");
statusColumn.setCellValueFactory(cellData -> cellData.getValue().statusProperty());
statusColumn.setCellFactory(column -> {
return new TableCell() {
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (empty || item == null) {
setText(null);
setTextFill(Color.BLACK); // デフォルト色
} else {
setText(item);
// ステータスの値に応じて文字色を変更する
if ("異常".equals(item)) {
setTextFill(Color.RED);
} else if ("処理中".equals(item)) {
setTextFill(Color.BLUE);
} else {
setTextFill(Color.BLACK);
}
}
}
};
});
3. 1行単位のデータの書き換えと反映
データの変更は、該当行のオブジェクトを取得し、そのオブジェクトの Property.set() メソッドを通じて行います。
java
// 例: 0行目のデータを新しいデータに一括で書き換える場合
MyData rowData = tableView.getItems().get(0);
// プロパティ経由で更新する(これにより CellFactory の updateItem が自動で呼ばれます)
rowData.setStatus("異常");
rowData.setName("新しい名前");
4. (おまけ)特定の列の値ではなく、行全体の文字色を変える場合
もし「1つのカラムの値が変わったときに、同じ行にある他のカラムも含めたすべてのセルの文字色を変えたい」場合は、
CellFactory ではなく RowFactory を使用します。
java
tableView.setRowFactory(tv -> new TableRow() {
@Override
protected void updateItem(MyData item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setStyle("");
} else {
// 例: status の値によって行全体の文字色を変える場合
if ("異常".equals(item.getStatus())) {
setStyle("-fx-text-fill: red;");
} else {
setStyle("-fx-text-fill: black;");
}
}
}
});
このアプローチを利用することで、
tableView.getItems() で取得したインスタンスのプロパティを更新するだけで、
自動的かつ効率的にTableView側の文字色が再描画されます。