6

JavaFX2 のTableViewは、「実行時のユーザーによる列の並べ替え」を備えています。アプリケーション内の特定のテーブルに対してこの機能を無効にしたいと考えています。

API doc を見ると、これに対する明らかな API フックはありません。ただし、columnsプロパティがあります。ドキュメントによると、それは

この TableView の一部である TableColumns。ユーザーが 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ます。
並べ替えを防止する方法、または少なくともプログラムで元に戻す方法はありますか?

4

1 に答える 1

9

以下のSSCCEを参照してください。これは、リスナーが呼び出されることを示していますが、added列を移動するときにフラグが設定されます。next()変更を使用する前に呼び出す必要があることに注意してください。そうしないと、が表示されますIllegalStateException。簡単な正規の例については、のjavadocを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();
  }
}
于 2012-05-15T10:40:58.923 に答える