JavaFx Tableview,如何在同一个工厂中添加监听器和覆盖updateItem

时间:2015-03-03 11:52:20

标签: java javafx

我目前正在开发一个带有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)并同时附加一个监听器?

最好的问候

1 个答案:

答案 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;
});