web-dev-qa-db-ja.com

Javafx:列の値に基づいてTableViewが行の色を変更する

列セルとそれに対応する行の両方の色を更新する次のコードがあります。

    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」条件のコードセグメントが機能しません。オブジェクトへの正しい参照と、これを行うための最良の方法を特定できません。

ありがとう!

7
Dilpreet Kaur
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");
                }
            }
        };
    });
}

これでうまくいきます!

13
Dilpreet Kaur

私は最近この問題について少し研究をしました。次のコードを使用すると、列の値に基づいて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コードは効果がありません。

6
Pablo Insua

正しい方法は、テーブルの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("");
    }
});
3
Joe Almore

多くの検索の後、私は答えを見つけました。テーブルの特定の行に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;
}