我目前正在开发一个带有TableView元素的小型学习项目。我正在根据其内容更改每行的背景颜色:
TableView.setRowFactory((row) -> new TableRow<Person>() {
@Override
public void updateItem(Person person, boolean empty) {
super.updateItem(person, empty);
switch (person.getPersonStatus()) {
case ST:
setStyle("-fx-control-inner-background: " + StatusColor.B_LIGHT.getMyColorValue() + "; -fx-text-fill: #fff;");
break;
case CD:
setStyle("-fx-control-inner-background: " + StatusColor.D_LIGHT.getMyColorValue() + "; -fx-text-fill: #fff;");
break;
}
}
我还想在双击该行时获得该行中对象的引用。我使用此代码:
TableView.setRowFactory((row) -> {
TableRow<Person> row = new TableRow<>();
row.setOnMouseClicked(event -> {
if (event.getClickCount() == 2 && (!row.isEmpty())) {
Person rowData = row.getItem();
System.out.println(rowData);
}
});
return row;
});
但是这不起作用(我假设因为我正在分配两个相互覆盖的因子)。有人可以帮我把两个代码示例合并到一个工作的例子中吗?如何覆盖工厂中的函数(updateItem)并同时附加一个监听器?
最好的问候
答案 0 :(得分:1)
只需将侦听器添加到您在第一个代码块中创建的TableRow
:
TableView.setRowFactory((tv) -> {
TableRow<Row> row = new TableRow<Person>() {
@Override
public void updateItem(Person person, boolean empty) {
super.updateItem(person, empty);
switch (person.getPersonStatus()) {
case ST:
setStyle("-fx-control-inner-background: " + StatusColor.B_LIGHT.getMyColorValue() + "; -fx-text-fill: #fff;");
break;
case CD:
setStyle("-fx-control-inner-background: " + StatusColor.D_LIGHT.getMyColorValue() + "; -fx-text-fill: #fff;");
break;
}
}
};
row.setOnMouseClicked(event -> {
if (event.getClickCount() == 2 && (!row.isEmpty())) {
Person rowData = row.getItem();
System.out.println(rowData);
}
});
return row;
});