我有一个我想要应用的tableview取决于行项不同样式的值。
例如:
每行代表一个拥有财产年的人,所以如果人< 18年,行颜色应为红色。如果是人> 60年,行颜色应该是绿色的......
我在SO上搜索关于行的应用样式,但大多数情况下尝试应用于选定的行,而其他情况则使用cellfactories(我不知道是否可以设置整行的样式,或者我需要为每个行应用样式字段)。
答案 0 :(得分:2)
只需设置一个行工厂。管理样式的最佳方法是使用CSS PseudoClass
s。在你的例子中,你可以有一个用于“年轻”,一个用于“旧”:
PsuedoClass old = PseudoClass.getPseudoClass("old");
PsuedoClass young = PseudoClass.getPseudoClass("young");
tableView.setRowFactory(tv -> {
TableRow<Person> row = new TableRow<>();
ChangeListener<Number> yearsListener = (obs, oldAge, newAge) -> {
int age = newAge.intValue();
row.pseudoClassStateChanged(old, age > 60);
row.pseudoClassStateChanged(young, age < 18);
};
row.itemProperty().addListener((obs, previousPerson, currentPerson) -> {
if (previousPerson != null) {
previousPerson.yearsProperty().removeListener(yearsListener);
}
if (currentPerson != null) {
currentPerson.yearsProperty().addListener(yearsListener);
row.pseudoClassStateChanged(old, currentPerson.getYears() > 60);
row.pseudoClassStateChanged(young, currentPerson.getYears() < 18);
} else {
row.pseudoClassStateChanged(old, false);
row.pseudoClassStateChanged(young, false);
}
});
return row ;
});
如果您知道每个Person
的年份是固定的(即在显示表格时它们不会改变),您可以将其简化为
PsuedoClass old = PseudoClass.getPseudoClass("old");
PsuedoClass young = PseudoClass.getPseudoClass("young");
tableView.setRowFactory(tv -> {
TableRow<Person> row = new TableRow<>();
row.itemProperty().addListener((obs, previousPerson, currentPerson) -> {
if (currentPerson != null) {
row.pseudoClassStateChanged(old, currentPerson.getYears() > 60);
row.pseudoClassStateChanged(young, currentPerson.getYears() < 18);
} else {
row.pseudoClassStateChanged(old, false);
row.pseudoClassStateChanged(young, false);
}
});
return row ;
});
现在应用样式只需创建一个包含所需样式的外部样式表:
.table-row-cell:young {
-fx-background: green ;
}
.table-row-cell:old {
-fx-background: blue ;
}