Событие наведения распространяется на несколько табличных представлений - PullRequest
0 голосов
/ 04 мая 2020

Я хотел бы знать, можно ли выделить строки нескольких таблиц при наведении на строку в таблице.

Кажется, что нет индекса hover из свойства hover TableView. Параметр hoverProperty указывает только на то, выполняется ли его наведение.

Кроме того, как принудительно навести состояние наведения строки в таблице?

Вот пример, когда пользователь наводит курсор на строку в TableView 1 , Соответствующая строка TableView 2 также будет выделена.

------------------------------------------------------------------------------
| TableView 1                        |  TableView 2                          |  
|                                    |                                       |
|==Entry A===========================|==Entry 1==============================| <-- highlighted row
|  Entry B                           |  Entry 2                              |     
------------------------------------------------------------------------------

Спасибо!

РЕДАКТИРОВАТЬ: я использую JDK 1.8

РЕДАКТИРОВАТЬ 2: Спасибо James_D за подсказку Мне удалось найти решение. Не слишком уверен, что это лучший способ реализации, но он работает.

public class CustomTableView<T> extends TableView<T> {
    private static final String HIGHLIGHT = "highlight";
    private final IntegerProperty currHoverIdx = new SimpleIntegerProperty();

    public CustomTableView() {
        super();
        registerCallback();

        currHoverIdx.set(-1);
    }

    public IntegerProperty highlightProperty() {
        return currHoverIdx;
    }

    private void registerCallback() {
        final Callback<TableView<T>, TableRow<T>> rowFac = this.getRowFactory();
        final PseudoClass highlightPc = PseudoClass.getPseudoClass(HIGHLIGHT);

        final Callback<TableView<T>, TableRow<T>> modRowFac = param -> {
            TableRow<T> row;
            if (rowFac != null) {
                row = rowFac.call(param);
            } else {
                row = new TableRow<T>();
            }

            row.hoverProperty().addListener((ov, oldVal, newVal) -> {
                if (newVal) {
                    currHoverIdx.set(row.getIndex());
                } else {
                    currHoverIdx.set(-1);
                }
            });

            currHoverIdx.addListener((ov, oldVal, newVal) -> {
                Number valOld = (Number) oldVal;
                int rowIdx = row.getIndex();
                if (valOld.intValue() == rowIdx) {
                    row.pseudoClassStateChanged(highlightPc, false);
                } else {
                    Number valNew = (Number) newVal;
                    if (valNew.intValue() == rowIdx) {
                        row.pseudoClassStateChanged(highlightPc, true);
                    }
                }
            });

            return row;
        };
        this.setRowFactory(modRowFac);
    }
}

Как его использовать:

CustomTableView<Integer> left;
CustomTableView<String> right;

...
...
...

IntegerProperty left = leftTable.highlightProperty();
IntegerProperty right = leftTable.highlightProperty();

left.addListener((ov, oldVal, newVal) -> {
    Number valNew = (Number) newVal;
    right.set(valNew.intValue());
});

right.addListener((ov, oldVal, newVal) -> {
    Number valNew = (Number) newVal;
    left.set(valNew.intValue());
});

CSS:

.table-view .table-row-cell:highlight {
    -fx-background-color: #D3D3D3;
    -fx-table-cell-border-color: transparent;
}

PS - Я пытался опустить части моего кода, не связанные с этим вопросом, но суть его в этом.

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