JavaFX, как заморозить позицию некоторых столбцов в TableView
Идея такова: в TableView из N столбцов, чтобы первые M столбцов всегда были видны даже при использовании горизонтального скроллера.
Единственное, что подходит моему требованию, это Связывание двух табличных представлений вместе, чтобы они синхронизировались.
Идея ставить бок о бок две таблицы не самая лучшая по моей точке зрения, потому что
1) Тип столбца частично индивидуален между двумя таблицами: если вы используете один и тот же наблюдаемый список, строки сортируются в обеих таблицах, но это невозможно для сортировки по нескольким столбцам, где по крайней мере один столбец не находится на та же таблица
2) Синхронный свиток отсутствует с колесиком мыши или клавишами стрелок
Я знаю, что, возможно, я могу справиться с такими проблемами, как использование EventHandlers и Listeners, но я надеюсь, что можно использовать только одну таблицу.
Итак, возникает вопрос: существуют ли какие-либо настраиваемые свойства в TableView или TableColumns для того, чтобы я искал поведение?
Ответы
Ответ 1
Итак, возникает вопрос: существуют ли какие-либо настраиваемые свойства в TableView или TableColumns для того, чтобы я искал поведение?
По-видимому, нет, но для этого поведения на JavaFX Jira есть запрос функции (вам нужно зарегистрироваться для его просмотра):
https://javafx-jira.kenai.com/browse/RT-19454
Я предлагаю вам голосовать за него.: ^)
Ответ 2
В настоящее время такой функции нет. Фактически даже манипулирование полосой прокрутки и реагирование на события полосы прокрутки проблематичны. Два варианта, о которых я могу думать:
Вариант №1 - Несколько таблиц
Создайте новый макет, который содержит две таблицы и две полосы прокрутки, например, в фрагменте FXML ниже:
<BorderPane prefHeight="200.0" prefWidth="200.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<bottom>
<ScrollBar fx:id="hScroll" />
</bottom>
<center>
<HBox fx:id="varTable" prefHeight="100.0" prefWidth="200.0">
<children>
<TableView fx:id="fixedTable" prefHeight="200.0" prefWidth="200.0">
<columns>
<TableColumn prefWidth="75.0" text="Column X" />
<TableColumn prefWidth="75.0" text="Column X" />
</columns>
</TableView>
<TableView prefHeight="200.0" prefWidth="200.0" HBox.hgrow="ALWAYS">
<columns>
<TableColumn prefWidth="75.0" text="Column X" />
<TableColumn prefWidth="75.0" text="Column X" />
</columns>
</TableView>
</children>
</HBox>
</center>
<right>
<ScrollBar fx:id="vScroll" orientation="VERTICAL" />
</right>
</BorderPane>
Обратите внимание, что во втором tabe установлен HBox.hgrow = "ВСЕГДА".
Напишите функцию для поиска полосы прокрутки в TableView:
private static final ScrollBar getScrollBar(final TableView<?> tableView) {
for (final VirtualFlow virtualFlow: Nodes.filter(Nodes.descendents(tableView, 2), VirtualFlow.class)) {
for (final Node subNode: virtualFlow.getChildrenUnmodifiable()) {
if (subNode instanceof ScrollBar && ((ScrollBar)subNode).getOrientation() == Orientation.VERTICAL) {
return (ScrollBar)subNode;
}
}
}
return null;
}
Используйте это, чтобы найти две вертикальные полосы прокрутки и привязать их свойства (например, min, max, value и т.д.) к вашей собственной вертикальной полосе прокрутки, а затем скрыть исходные полосы прокрутки. Вам также необходимо установить managed = false, чтобы они не занимали место в макете.
Найдите и скройте горизонтальные полосы прокрутки и привяжите свойства горизонтальной полосы прокрутки таблицы "перемещение" к вашей собственной горизонтальной полосе прокрутки.
Мы успешно используем этот метод, чтобы связать две таблицы с одной полосой прокрутки, ожидая, что эта Jira будет исправлена.
Вариант №2 - Напишите свой собственный TableViewSkin
Загрузите источник JavaFx, чтобы узнать, что они делают с кожей, а затем вы можете либо написать полный пользовательский скин, либо написать скин, который обертывает две обычные скины и реализует аналогично Option # 1 выше
Ответ 3
Я могу заморозить столбцы в представлении таблицы javafx. Нам нужно создать собственный класс столбцов таблицы, в котором мы будем иметь два метода setFixed
и isFixed
, которые будут использоваться для исправления некоторых столбцов.
Кроме этого вам нужно создать свой собственный
Ответ 4
JavaFX не имеет этой функции. Проверьте ControlsFX SpreadsheetView.