2012-05-15 6 views
6

JavaFX2のTableViewの機能 "実行時にユーザーが列を並べ替える"。 私はアプリケーション内の特定のテーブルに対してこの機能を無効にしたいと思います。JavaFX2 TableViewで列並べ替えを無効にするにはどうすればよいですか?

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

を表しています。このTableViewの一部であるTableColumns。ユーザーがTableView列を並べ替えると、このリストは現在の表示順序を反映して更新されます。

変更が発生した後に少なくともリセットすることができたら、リスナーを追加して変更後の事実をリセットしてみました。私はwasPermutatedを頼むとき

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を中止します。
並べ替えを防止する方法はありますか、または少なくともプログラム的に元に戻す方法はありますか?

+0

私はそのメソッドを試したところ、列を移動するときに 'onChanged'メソッドが呼び出されます。しかし、私は 'change.wasPermutated()'でIllegalStateExceptionを取得します。 – assylias

+0

その場合、私のコードは多分複雑すぎるでしょう。私は最小限の例を設定し、そこから続行します。 –

+1

ちょうど私の答えを編集し、作品の種類。状態を確認する前に 'change.next()'を最初に呼び出す必要があります+移動する列は、置換されたものではなく、追加されたフラグを設定しているようです... – assylias

答えて

8

リスナーが呼び出されたことを示す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(); 
    } 
} 
+0

あなたのコメントのおかげで、私は現在実用的なサンプルを持っています。私のコードはあなたのものよりも簡潔であり、私はそれがより良い質問に答えると感じますが、私はあなたに解決策があると考えています。あなたの答えを編集して自分のコードを表示し、それを受け入れたものとしてマークしても大丈夫ですか? –

+0

@UrsReupke確かに - 私の答えは部分的なものです - あなたが答えを投稿し、あなたが望むことをしたらそれを受け入れるべきです。 – assylias

+0

自分の電話を編集したり、新しい電話を作成したりすることができます。 – assylias