根据内容更改TableRow颜色

时间:2015-07-01 19:45:26

标签: java javafx

我想创建一个基于行内容更改行颜色的表。因此,我使用以下代码。我自己做了这个,这似乎是问题的原因;)因为设置ServletContextListener背景的部分似乎没有按预期工作:

不是row row改变了它的颜色,而是上面的颜色。 如您所见,我在设置颜色之前放置了GOODFRIENDS,以确保System.out.println(row.getItem());是正确的“行”。 - 确实如此。所以在那一点上我不知道为什么总是错误的row被着色而运行时的row引用是另一个(正确的)。

有什么想法吗?

row

更新: James_D解决方案适用于着色行,但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; } 事件不起作用,因为它们基于现在空的行对象。

sedOnMouseClicked

1 个答案:

答案 0 :(得分:1)

您似乎假设将为表中的每个项目创建一个表行,并按照项目存在的顺序创建。没有这样的保证,事实上在大多数情况下,这种情况不会发生。基本上为每个可见行创建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 ;
});