Как отключить переупорядочение столбцов в JavaFX2 TableView?

В TableView функции JavaFX2 "изменение порядка столбцов пользователем во время выполнения ". Я бы хотел отключить эту функцию для одной конкретной таблицы в моем приложении.

Глядя на документ API, для этого нет очевидного API-интерфейса. Однако есть свойство columns. Согласно документу, он представляет собой

Столбцы TableColumns, которые являются частью этого TableView. Когда пользователь меняет порядок столбцов TableView, этот список будет обновляться, чтобы отразить текущий визуальный порядок.

Надеясь, что я, по крайней мере, смогу сбросить изменение после того, как оно произошло, я попытался добавить слушателя для сброса изменений постфактум.

import javafx.application.Application;
import javafx.collections.ListChangeListener;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.stage.Stage;

public class TableTest extends Application {

  public static void main(String[] args) {
    launch(args);
  }


  @Override
  public void start(Stage stage) {
    TableView tableView = new TableView();
    tableView.getColumns().setAll(new TableColumn(), new TableColumn());
    tableView.getColumns().addListener(new ListChangeListener() {
        @Override
        public void onChanged(Change change) {
            if (change.wasPermutated()){
               change.reset();
            }
        }
    });
    stage.setScene(new Scene(tableView));
    stage.show();
  }
}

Однако слушатель прерывает работу с IllegalStateException, когда я запрашиваю wasPermutated.
Есть ли способ предотвратить изменение порядка или, по крайней мере, отменить его программно?


person Urs Reupke    schedule 15.05.2012    source источник
comment
Я только что попробовал этот метод, и метод onChanged вызывается при перемещении столбцов. Однако я получаю исключение IllegalStateException на change.wasPermutated().   -  person assylias    schedule 15.05.2012
comment
В этом случае мой код, вероятно, был слишком сложным. Я приведу минимальный пример и продолжу оттуда.   -  person Urs Reupke    schedule 15.05.2012
comment
Просто отредактировал свой ответ, и он вроде работает. Вам нужно сначала вызвать change.next(), прежде чем проверять его состояние + движущиеся столбцы, кажется, устанавливают флаг на добавленный, а не перестановочный ...   -  person assylias    schedule 15.05.2012
comment
Также сброс, похоже, не делает то, что, по вашему мнению, он делает - см. Здесь javadoc: docs.oracle.com/javafx/2/api/javafx/collections/   -  person assylias    schedule 15.05.2012


Ответы (1)


См. Ниже SSCCE, который показывает, что слушатель вызывается, но при перемещении столбцов установлен флаг added. Обратите внимание, что вам необходимо позвонить next() перед использованием изменения, иначе вы получите IllegalStateException. См. javadoc of ListChangeListener.Change для простого канонического пример.

import javafx.application.Application;
import javafx.collections.ListChangeListener;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.stage.Stage;

public class TableTest extends Application {

  public static void main(String[] args) {
      launch(args);
  }

  @Override
  public void start(Stage stage) {
    final TableView tableView = new TableView();
    final TableColumn[] columns = {new TableColumn("1"), new TableColumn("2")};
    tableView.getColumns().setAll(columns);
    tableView.getColumns().addListener(new ListChangeListener() {
        public boolean suspended;

        @Override
        public void onChanged(Change change) {
            change.next();
            if (change.wasReplaced() && !suspended) {
                this.suspended = true;
                tableView.getColumns().setAll(columns);
                this.suspended = false;
            }
        }
    });
    stage.setScene(new Scene(tableView));
    stage.show();
  }
}
person assylias    schedule 15.05.2012
comment
Благодаря вашим комментариям у меня теперь есть рабочий образец. Мой код более краток, чем ваш, и я считаю, что он лучше отвечает на вопрос, но я хотел бы приписать решение вам. Ничего страшного, если я отредактирую ваш ответ, чтобы показать свой код и пометить его как принятый? - person Urs Reupke; 15.05.2012
comment
@UrsReupke Конечно - мой ответ частичный - вы должны опубликовать свой ответ и принять его, если он сделает то, что вы хотели. - person assylias; 15.05.2012
comment
/ * Я преобразовал его в общую функцию * / @SuppressWarnings ({rawtypes, unchecked}) public static void moveableFalse (TableView tableView) {List ‹TableColumn‹ ?,? ›› columns = new ArrayList (tableView.getColumns ()); tableView.getColumns (). addListener (new ListChangeListener () {публичное логическое значение приостановлено; @Override public void onChanged (Изменить изменение) {change.next (); if (change.wasReplaced () &&! Suspended) {this.suspended = true ; tableView.getColumns (). setAll (columns); this.suspended = false;}}}); } - person pdem; 14.12.2017