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

Кроме этого вам нужно создать свой собственный

  • TableViewskin

  • TableHeaderRow - в основном в этом классе вам нужно переопределить метод getRootHeader()

  • NestedTableColumnHeader - В этом классе переопределить метод layoutChildren() и добавить новый метод в макет fixedColumns
  • VirtualFlow
  • TableView - переопределить createDefaultSkin(), добавить новый booleanProperty showColumnHeader и один ObservableArrayList для fixedTableColumn
  • TableRow - Переопределить createDefaultSkin()
  • TableRowSkinBase - переопределить метод layoutChildren() для обработки фиксированных столбцов.

Ответ 4

JavaFX не имеет этой функции. Проверьте ControlsFX SpreadsheetView.