从TableView和UpdateItem覆盖方法

时间:2018-05-22 11:31:14

标签: java javafx

我从tableView获取行。我使用setRowFactory来获取行,后来我正在使用它。

我需要覆盖updateItem方法来获取每一行,如果该行内的项有错误,则使用红色,否则使用绿色。

该行内的项目是"历史"对象,因为行是历史记录 - 历史记录,它是在应用程序中执行某些操作后创建的。

所以我有这样的事情:

@Override
        protected void updateItem(History history, boolean empty) {
            super.updateItem(history, empty);
            if (empty) {
                setStyle("");
            } else if (history.isHasError() == true) {
                getStyleClass().clear();
                getStyleClass().add("errorHistoryRow");
            } else if (history.isHasError() == false){
                getStyleClass().clear();
                getStyleClass().add("");
            }
        }

但我需要将此updateItem添加到此方法中已定义的行。

private void openErrorMessageAfterHoveringOverRow() {

        historyTableView.setRowFactory(tableView -> {
        final TableRow<History> row = new TableRow<>();


        for (History history : model.getAllHistoryObservableArrayList()) {
            ***I NEED TO PUT IT HERE***
        }                   

        for (History his : model.getAllHistoryObservableArrayList()) {

            row.hoverProperty().addListener((observable) -> {
                History historyRow = row.getItem();

                Point p = MouseInfo.getPointerInfo().getLocation();
                int x = p.x;
                int y = p.y;

                Popup popup = new Popup();
                popup.setX(x - 300);
                popup.setY(y - 200);
                TextArea ta = new TextArea();

                AnchorPane layout = new AnchorPane();
                Scene scene = new Scene(layout);
                stageSingleton().setScene(scene);

                if (row.isHover() && his.equals(historyRow)) {
                    ta.setText(row.getItem().getErrorMessage());
                    popup.getContent().addAll(ta);
                    stageSingleton().show();
                    popup.show(stageSingleton());

                } else if (!row.isHover() && his.equals(historyRow)) {
                    popup.hide();
                    stageSingleton().close();
                }
            });
        }
        return row;
    });       
}

那么,我怎样才能将方法updateItem实现为此方法中已定义的行?因为下面的方法有效但我不能有2个不同的&#34; setRowFactory&#34;我项目中的方法。所以我需要在一种方法中合并它们。

public void test() {
        historyTableView.setRowFactory(tableView -> new TableRow<History>() {
        @Override
        protected void updateItem(History history, boolean empty) {
            super.updateItem(history, empty);
            if (empty) {
                setStyle("");
            } else if (history.isHasError() == true) {
                getStyleClass().clear();
                getStyleClass().add("errorHistoryRow");
            } else if (history.isHasError() == false){
                getStyleClass().clear();
                getStyleClass().add("");
            }
        }
    });
}

1 个答案:

答案 0 :(得分:1)

不可能使用不同的rowFactory s(至少你不能删除已经创建的行)。您需要合并rowFactory返回的行中的功能。

一些补充说明:

  • 如果您的行变空,您还需要删除样式类。但是,清除样式类会干扰默认样式(删除table-row-cell样式类)。在这种情况下,使用伪类更容易。此外,将空字符串添加为样式类对任何方式都没有好处。
  • 不要将InvalidationListener用于hover媒体资源。每当值发生变化时,如果它从true变为false或反过来,则会触发此类侦听器。
public class HistoryRow extends TableRow<History> {

    private static final PseudoClass ERROR = PseudoClass.getPseudoClass("error");

    public HistoryRow() {
        hoverProperty().addListener((o, oldValue, newValue) -> {
            if (newValue) {
                History historyRow = getItem();
                if (historyRow != null && historyRow.isHasError()) {
                    // TODO: display popup here
                } 
            }
        });
    }

    @Override
    protected void updateItem(History history, boolean empty) {
        super.updateItem(history, empty);
        pseudoClassStateChanged(ERROR, !empty && history != null && history.isHasError());
    }

}

在CSS样式表中,从样式类更改为伪类需要您调整选择器。您需要使用:error伪类选择器而不是.errorHistoryRow类选择器。

通过向BooleanProperty添加History并在updateItem方法中添加/删除侦听器,可以动态地从错误的历史记录元素更改为非错误的方法,反之亦然如果有必要的话。