<AI>
JavaFXのTableViewでカラムの値に応じて文字色(テキストカラー)を変更するには、
対象のTableColumnに対して setCellFactory を設定し、updateItem() メソッドをオーバーライドします。
具体的な実装手順とサンプルコードを以下に示します。
実装手順
1. setCellFactory を使ってカスタムな TableCell を生成します。
2. updateItem(item, empty) メソッドをオーバーライドします。
3. 値(item)や行のデータ(getTableRow().getItem())を判定し、
条件に一致する場合は setTextFill() メソッドで文字色を変更します。
サンプルコード(値が "完了" の場合は文字色を青にする例)
java
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class TableViewColorSample extends Application {
// データモデルクラス
public static class Task {
private final SimpleStringProperty name;
private final SimpleStringProperty status;
public Task(String name, String status) {
this.name = new SimpleStringProperty(name);
this.status = new SimpleStringProperty(status);
}
public String getStatus() {
return status.get();
}
public String getName() {
return name.get();
}
}
@Override
public void start(Stage primaryStage) {
TableView<Task> table = new TableView<>();
ObservableList<Task> data = FXCollections.observableArrayList(
new Task("タスクA", "進行中"),
new Task("タスクB", "完了"),
new Task("タスクC", "未着手")
);
// カラムの作成
TableColumn<Task, String> nameCol = new TableColumn<>("タスク名");
nameCol.setCellValueFactory(cellData -> new SimpleStringProperty(cellData.getValue().getName()));
TableColumn<Task, String> statusCol = new TableColumn<>("ステータス");
statusCol.setCellValueFactory(cellData -> new SimpleStringProperty(cellData.getValue().getStatus()));
// ★文字色を変更する処理(CellFactoryの設定)
statusCol.setCellFactory(column -> {
return new javafx.scene.control.TableCell<Task, String>() {
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (empty || item == null) {
setText(null);
setGraphic(null);
setTextFill(Color.BLACK); // デフォルト色
} else {
setText(item);
// 値が「完了」の場合は文字色を青色に変更
if (item.equals("完了")) {
setTextFill(Color.BLUE);
} else {
setTextFill(Color.BLACK);
}
}
}
};
});
table.getColumns().addAll(nameCol, statusCol);
table.setItems(data);
Scene scene = new Scene(table, 300, 200);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
ポイント
・ empty または item が null の場合の処理を必ず記述してください(スクロール時に前のセルの色が引き継がれてしまう不具合を防ぐため)。
・ 文字色の変更は -fx-text-fill プロパティ(またはCSS)を使って行うことも可能です。
・ 選択行(ハイライト)が見えにくくなるのを防ぐため、選択中(isSelected())かどうかを条件に含めることも一般的です。
詳細なJavaDocや公式のカスタマイズガイドについては、
Cell API ドキュメント(Oracle) または UIコントロールのカスタマイズ(Oracle) をご参照ください。