Получить строку из метода переопределения TableView и UpdateItem - PullRequest
0 голосов
/ 22 мая 2018

Я получаю строку из 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 разных методов "setRowFactory" в моем проекте.Поэтому мне нужно объединить их одним способом.

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 голосов
/ 22 мая 2018

Невозможно использовать разные rowFactory с (по крайней мере, вы не можете удалить строки, которые уже были созданы).Вам необходимо объединить функциональность в строках, возвращаемых вашим 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, если необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...