列セルとそれに対応する行の両方の色を更新する次のコードがあります。
calltypel.setCellFactory(column -> {
return new TableCell<CallLogs, String>() {
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
setText(empty ? "" : getItem().toString());
setGraphic(null);
TableRow currentRow = getTableRow();
//This doesn't work
if(item.equals("a")){
item.setTextFill(Color.RED);
currentRow.setTextFill(Color.PINK);
}
else{
item.setTextFill(Color.GREEN);
currentRow.setTextFill(Color.BLUE);
}
}
};
});
「if」条件のコードセグメントが機能しません。オブジェクトへの正しい参照と、これを行うための最良の方法を特定できません。
ありがとう!
private void customiseFactory(TableColumn<CallLogs, String> calltypel) {
calltypel.setCellFactory(column -> {
return new TableCell<CallLogs, String>() {
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
setText(empty ? "" : getItem().toString());
setGraphic(null);
TableRow<CallLogs> currentRow = getTableRow();
if (!isEmpty()) {
if(item.equals("a"))
currentRow.setStyle("-fx-background-color:lightcoral");
else
currentRow.setStyle("-fx-background-color:lightgreen");
}
}
};
});
}
これでうまくいきます!
私は最近この問題について少し研究をしました。次のコードを使用すると、列の値に基づいてTableViewの行の色を変更できます(できる限り説明します)。
まず、TableViewとこのTableViewの列を定義する必要があります。
private TableView<Person> personTable;
private TableColumn<Person, String> nameColumn;
private TableColumn<Person, String> lastNameColumn;
次のステップは、いずれかの列のセルファクトリを定義することです。
nameColumn.setCellFactory(column -> {
return new TableCell<Person, String>() {
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty); //This is mandatory
if (item == null || empty) { //If the cell is empty
setText(null);
setStyle("");
} else { //If the cell is not empty
setText(item); //Put the String data in the cell
//We get here all the info of the Person of this row
Person auxPerson = getTableView().getItems().get(getIndex());
// Style all persons wich name is "Edgard"
if (auxPerson.getName().equals("Edgard")) {
setTextFill(Color.RED); //The text in red
setStyle("-fx-background-color: yellow"); //The background of the cell in yellow
} else {
//Here I see if the row of this cell is selected or not
if(getTableView().getSelectionModel().getSelectedItems().contains(auxPerson))
setTextFill(Color.WHITE);
else
setTextFill(Color.BLACK);
}
}
}
};
});
コードのロジック:上書きするupdateItem()メソッド。基礎となるアイテムが変更されると自動的に呼び出されます。
レンダリングする必要があるデータ項目(この場合はString)を受け取ります。アイテムが空またはnull(空のセルなど)の場合、スタイルは適用されません。それ以外の場合は、個人の名前に応じて、アイテムをフォーマットし、セルのテキストを設定し、色と背景も設定します。
このセルの色をテーブルの他の列に適用する場合は、「セルファクトリ」ではなく「行ファクトリ」を使用する必要がありますが、コードのロジックは同様です。
personTable.setRowFactory(row -> new TableRow<Person>(){
@Override
public void updateItem(Person item, boolean empty){
super.updateItem(item, empty);
if (item == null || empty) {
setStyle("");
} else {
//Now 'item' has all the info of the Person in this row
if (item.getName().equals("Edgar")) {
//We apply now the changes in all the cells of the row
for(int i=0; i<getChildren().size();i++){
((Labeled) getChildren().get(i)).setTextFill(Color.RED);
((Labeled) getChildren().get(i)).setStyle("-fx-background-color: yellow");
}
} else {
if(getTableView().getSelectionModel().getSelectedItems().contains(item)){
for(int i=0; i<getChildren().size();i++){
((Labeled) getChildren().get(i)).setTextFill(Color.WHITE);;
}
}
else{
for(int i=0; i<getChildren().size();i++){
((Labeled) getChildren().get(i)).setTextFill(Color.BLACK);;
}
}
}
}
}
});
これは、行のすべてのセルにスタイルの変更を適用するために見つけた最良の方法です。セルファクトリ内でメソッド「getTableRow()」を使用する場合、セルの子を変更することはできません。
注1:テキストのスタイルを変更する場合は、セルで作業する必要があります。この変更を行で直接実行しようとしても、効果はありません。
注2:別のCSSファイルを使用している場合は、次のように記述しないでください。
.table-cell {
-fx-text-fill: Black;
}
これを行うと、すべてのJavaコードは効果がありません。
正しい方法は、テーブルのsetRowFactory
を使用することです。
table.setRowFactory(tv -> new TableRow<CustomItem>() {
@Override
protected void updateItem(CustomItemitem, boolean empty) {
super.updateItem(item, empty);
if (item == null || item.getValue() == null)
setStyle("");
else if (item.getValue() > 0)
setStyle("-fx-background-color: #baffba;");
else if (item.getValue() < 0)
setStyle("-fx-background-color: #ffd7d1;");
else
setStyle("");
}
});
多くの検索の後、私は答えを見つけました。テーブルの特定の行にIDを設定し、行IDに応じて外部CSSファイルで色を設定する必要があります。エラー行の色を赤に変更する例を次に示します。 Javaコード:
resultsTable.setRowFactory(row -> new TableRow<Result>() {
@Override
public void updateItem(Result item, boolean empty) {
super.updateItem(item, empty);
if (item == null) {
setStyle("");
} else if (item.getResultType().equalsIgnoreCase("Error")) {
this.setId("error");
} else {
this.setId("not-error");
}
}
});
CSSファイル:
#error .text{
-fx-fill : red;
}
#not-error .text{
-fx-fill : black;
}