簡體   English   中英

根據內容更改TableRow顏色

[英]Change TableRow color based on content

我想制作一個根據行的內容更改行顏色的表。 因此,我使用以下代碼。 我自己完成了此操作,這似乎是問題的原因;)因為設置row背景的那一部分似乎無法按預期工作:

帶有GOODFRIENDSrow不會更改其顏色,而是上面的行。 如您所見,我放置了System.out.println(row.getItem()); 在設置顏色之前,請確保該row是正確的“行”。 -是的。 所以到那時我還不知道為什么總是在錯誤的row上塗上顏色,而在運行時row引用是另一行(正確的row )。

有任何想法嗎?

personTable.setRowFactory(new Callback<TableView<Person>, TableRow<Person>>() {

        Person person;
        int counter = 0;

        @Override
        public TableRow<Person> call(TableView<Person> tableView) {
            TableRow<Person> row = new TableRow<>();

            if (counter < tableView.getItems().size() && (person = tableView.getItems().get(counter)) != null) {
                row.setItem(person);
                counter++;
            }

            if (row.getItem() != null && row.getItem().getState() == State.GOODFRIEND) {
                System.out.println(row.getItem());
                row.setStyle("-fx-background-color: green;");
                //OR
                row.setBackground(new Background(
                        new BackgroundFill(Color.LIGHTGREEN, CornerRadii.EMPTY, new Insets(3, 0, 3, 0))));
            }

            row.setOnMouseClicked....

        return row;
    }

更新: James_D解決方案可以很好地為行着色,但是sedOnMouseClicked事件不起作用,因為它們基於現在為空的行對象。

    row.setOnMouseClicked(mouseEvent -> {
            if (!row.isEmpty()) {
                defriend_Button.setDisable(false);
                if (row.getItem().getState() == State.FRIEND) {
                    goodFriend_Button.setDisable(false);
                } else {
                    goodFriend_Button.setDisable(true);
                }
            } else if (row.isEmpty()) {
                personTable.getSelectionModel().select(null);
                defriend_Button.setDisable(true);
                goodfriend_Button.setDisable(true);
            }

            if (mouseEvent.getClickCount() == 2 && (!row.isEmpty())) {
                controller.showFriendDescriptionView(row.getItem());
            }
        });

您似乎假設將為表中的每個項目創建一個表格行,並以項目存在的順序進行創建。 沒有這樣的保證,實際上在大多數情況下這是不會發生的。 TableRow本質上是為每個可見行創建的(無論它們是否包含一個項目),當用戶滾動或顯示的項目由於其他原因而改變時, TableRow可以重用於顯示不同的項目。

因此,您需要重寫updateItem(...)方法並在那里執行邏輯。

personTable.setRowFactory(tv -> {
    TableRow<Person> row = new TableRow<Person>() {
        @Override
        public void updateItem(Person person, boolean empty) {
            super.updateItem(person, empty);
            if (person != null && person.getState() == State.GOODFRIEND) {
                setStyle("-fx-background-color: green;");
            } else {
                setStyle("");
            }
        }
    };
    row.setOnMouseClicked(...);
    return row ;
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM