Я хотел бы знать, можно ли выделить строки нескольких таблиц при наведении на строку в таблице.
Кажется, что нет индекса 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 - Я пытался опустить части моего кода, не связанные с этим вопросом, но суть его в этом.