在我的使用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");
}
}
};
}
});
但它不起作用。谁能帮我 ? :)
答案 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");
}
}
};
}
});