如果我已经在 table 上有一些事件,如何在 tableview 中为一行着色?

How to color a row in tabeview if i already have some event on that table?

我有这个事件,当用户点击一行时会做一些事情

 public void updateList(PoliseTable poliseTable) {

    poliseTable.getTableView().setRowFactory(tv -> {
        TableRow<PolisePOJO> row = new TableRow<>();
  
        row.setOnMouseClicked(event -> {
            if (event.getClickCount() == 1 && (!row.isEmpty())) {
                PolisePOJO rowData = row.getItem();                 
                List<PredmetiPOJO> predmetiList = PredmetiDAO.loadPredmete(rowData.getId());
                predmetiList.stream().forEach(e
                        -> predmetiTable.getPredmetiTable().getItems().add(new PredmetiPOJO(e.getId(),
                                e.getName(), e.getPlace(), e.getAdress(), e.getRegNumber(), e.getValue()))
                );
            }
        });
        return row;
    });
}

所以上面的方法现在工作正常我想根据一些列值给行着色这就是我试过的

    public void customizeColorRow(TableColumn column) {
    poliseTable.setRowFactory(tv -> new TableRow<PolisePOJO>() {
        @Override
        public void updateItem(PolisePOJO polise, boolean empty) {
            super.updateItem(polise, empty);
            if (polise == null) {
                setStyle("");
            } else if (polise.getStatus().equals("1")) {
                setStyle("-fx-background-color: tomato;");
            } else { 
                setStyle("");
            }
        }
    });
}

当我调用 customizeColorRow 方法时它不起作用,但是当我删除 updateList 方法时它就起作用了。我不太擅长 al lambda,所以也许我做错了什么。 那么我怎样才能同时使用这两种功能呢?

如评论中所述,TableView 只有一个行工厂。如果你设置行工厂两次,它只会有第二个工厂。只需使用 rowFactory 即可提供 TableRow 个具有您想要的所有功能的实例。

poliseTable.setRowFactory(tv -> {
    TableRow<PolisePOJO> row = new TableRow<>() {
        @Override
        public void updateItem(PolisePOJO polise, boolean empty) {
            super.updateItem(polise, empty);
            if (polise == null) {
                setStyle("");
            } else if (polise.getStatus().equals("1")) {
                setStyle("-fx-background-color: tomato;");
            } else { 
                setStyle("");
            }
        }
    };

    row.setOnMouseClicked(event -> {
        if (event.getClickCount() == 1 && (!row.isEmpty())) {
            PolisePOJO rowData = row.getItem();                 
            List<PredmetiPOJO> predmetiList = PredmetiDAO.loadPredmete(rowData.getId());
            predmetiList.forEach(e
                    -> predmetiTable.getPredmetiTable().getItems().add(new PredmetiPOJO(e.getId(),
                            e.getName(), e.getPlace(), e.getAdress(), e.getRegNumber(), e.getValue()))
            );
        }
    });
    return row;
});

如果你想保持功能分离,你可以用 itemProperty() 注册一个侦听器而不是覆盖 updateItem(),并“装饰”现有的行工厂:

public void updateList(TableView<PolisePOJO> poliseTable) {

    poliseTable.setRowFactory(tv -> {
        TableRow<PolisePOJO> row = getRowFromTable(tv);

        row.setOnMouseClicked(event -> {
            if (event.getClickCount() == 1 && (!row.isEmpty())) {
                PolisePOJO rowData = row.getItem();                 
                List<PredmetiPOJO> predmetiList = PredmetiDAO.loadPredmete(rowData.getId());
                predmetiList.stream().forEach(e
                        -> predmetiTable.getPredmetiTable().getItems().add(new PredmetiPOJO(e.getId(),
                                e.getName(), e.getPlace(), e.getAdress(), e.getRegNumber(), e.getValue()))
                );
            }
        });
        return row;
    });
}

public void customizeColorRow() {
    poliseTable.setRowFactory(tv -> {
        TableRow<PolisePOJO> row = getRowFromTable(tv) ;
        row.itemProperty().addListener((obs, oldPolise, polise) -> {
            if (polise == null) {
                row.setStyle("");
            } else if (polise.getStatus().equals("1")) {
                row.setStyle("-fx-background-color: tomato;");
            } else { 
                row.setStyle("");
            }
        });
        return row ;
    });
}

private TableRow<PolisePOJO> getRowFromTable(TableView<PolisePOJO> table) {
    Callback<TableView<PolisePOJO>, TableRow<PolisePOJO>> rowFactory = table.getRowFactory();
    if (rowFactory == null) {
        return new TableRow<>();
    } else {
        return rowFactory.call(table);
    }
}