有没有办法在javafx中改变tableview中一行的样式?

时间:2014-04-18 11:37:12

标签: java javafx

在我的使用javafx的应用程序中,我有一个包含几行的tableview。我想在一行中更改符合我自己要求的CSS样式。我试过了:

personTable.setRowFactory(new Callback<TableView<Person>, TableRow<Person>>() {
            @Override
            public TableRow<Person> call(TableView<Person> personTableView) {
                return new TableRow<Person>() {
                    @Override
                    protected void updateItem(Person person, boolean b) {
                        super.updateItem(person, b);
                        if(.../*my requirements*/) {                     
                            getStyleClass().add("priorityLow");
                        }
                    }
                };
            }
        });

但它不起作用。谁能帮我 ? :)

2 个答案:

答案 0 :(得分:3)

有关此主题的更全面讨论,请参阅Programmatically change the TableView row appearance

由于单元格被重用,您需要确保只将样式类添加到每个单元格一次。 (在您当前的代码中,如果项目从您的条件为真的项目更改为您的条件为真的另一项目,则样式类列表将包含重复的&#34; priorityLow&#34;条目。最终,您可以通过复制足够的内容可能会耗尽内存。)

此外,您需要删除任何&#34; priorityLow&#34;如果你的情况是假的。 (在您当前的代码中,如果项目从您的条件为真的项目更改为您的条件为假的项目,那么&#34; priorityLow&#34;类将保持不正确的附加。)

这样的事情:

personTable.setRowFactory(new Callback<TableView<Person>, TableRow<Person>>() {
            @Override
            public TableRow<Person> call(TableView<Person> personTableView) {
                return new TableRow<Person>() {
                    @Override
                    protected void updateItem(Person person, boolean b) {
                        super.updateItem(person, b);
                        if(.../*my requirements*/) { 
                            ObservableList<String> styles = getStyleClass();
                            if (! styles.contains("priorityLow")) {                    
                                getStyleClass().add("priorityLow");
                            }
                        } else {
                            // Remove all occurrences of "priorityLow":
                            styles.removeAll(Collections.singleton("priorityLow"));
                        }
                    }
                };
            }
        });

如果您使用的是JavaFX 8,使用PseudoClass es的解决方案将更清晰,更高效:

更新 PseudoClass版本(仅限Java 8):

final PseudoClass lowPriorityPseudoClass = PseudoClass.getPseudoClass("priority-low");
personTable.setRowFactory(new Callback<TableView<Person>, TableRow<Person>>() {
            @Override
            public TableRow<Person> call(TableView<Person> personTableView) {
                return new TableRow<Person>() {
                    @Override
                    protected void updateItem(Person person, boolean b) {
                        super.updateItem(person, b);
                        boolean lowPriority = /* my requirements */ ;
                        pseudoClassStateChanged(lowPriorityPseudoClass, lowPriority);
                    }
                };
            }
        });

和css看起来像:

.table-row-cell:priority-low {
 /* styles specific for low priority row */
}

答案 1 :(得分:0)

如果项目(person)为NULL,则不要运行验证。

这应该适合你。

personTable.setRowFactory(new Callback<TableView<Person>, TableRow<Person>>() 
{
    @Override public TableRow<Person> call(TableView<Person> personTableView) 
    {
        return new TableRow<Person>() 
        {
            @Override protected void updateItem(Person person, boolean b) 
            {
                super.updateItem(person, b);

                if (person == null)
                    return;

                if(Priority.LOW.equals(person.getPriority())) // Example requirement
                {                     
                    getStyleClass().add("priorityLow");
                }
            }
        };
    }
});