2017-02-24 19 views
1

テーブルのヘッダをマウスでクリックする方法はありますか?JavaFX TableViewヘッダをクリック

なぜこれが必要ですか?

私は多くの列を持つテーブルを持っています。しかし、全体のテーブルのための特定のwitdth。 スクロールを避けるために、各列に特定の幅(50程度)を与えたいだけです。ヘッダーをクリックするだけでこの列が展開され、内容を読むことができます。別のヘッダーをクリックすると、前のヘッダーが折りたたまれます。

うまくいけば、誰かが私を助けることができます:)

答えて

1

は、残念ながらこれを行うには良い方法はありません。唯一のパブリックAPIオプションは、列の "グラフィック"を独自のラベルに置き換え、マウスリスナーを追加することです。これを機能させるには、既存の列テキストをクリアする必要もあります。

注意あなたがイマイチ素敵column.setSortable(false)

@Override 
public void start(Stage primaryStage) throws Exception { 
    TableView<String> tableView = new TableView<>(); 
    TableColumn<String, Object> x = new TableColumn<>("x"); 
    tableView.getColumns().add(x); 
    TableColumn<String, Object> y = new TableColumn<>(""); 
    tableView.getColumns().add(y); 

    x.setSortable(false); 
    y.setSortable(false); 

    makeHeader(x, "X", 0); 
    makeHeader(y, "Y", 1); 

    EventHandler<? super MouseEvent> handler = event -> { 
     System.out.println("Column clicked " + ((Node)event.getTarget()).getProperties().get("index")); 
    }; 
    x.getGraphic().addEventFilter(MouseEvent.MOUSE_CLICKED, handler); 
    y.getGraphic().addEventFilter(MouseEvent.MOUSE_CLICKED, handler); 
    primaryStage.setScene(new Scene(tableView)); 
    primaryStage.show(); 
} 

private void makeHeader(TableColumn<?, ?> target, String name, int index) { 
    VBox vBox = new VBox(new Label(name)); 
    vBox.setAlignment(Pos.CENTER); 
    vBox.getProperties().put("index", index); 
    target.setGraphic(vBox); 
    target.setText(""); 
} 
+0

を呼び出すことも必要がありますが、動作しますので、デフォルトでは、列の並べ替えを実装するために、リスナーをクリックしたこと、あなたがこの動作を望んでいないようです。唯一の問題は、すべての列に対してイベントを作成したくないということです。イベント内で列インデックスを取得することは可能ですか? "X clicked"の代わりにsomething.getIndex()+ "clicked"が必要です。 – Hesk

+0

@Hesk更新された回答を参照してください。私はすべてのノードが持っている共有プロパティのハンドラで取得したカスタムプロパティマップにインデックスを保存しました... – Adam

+0

私は別の方法で私のテーブルを設計しました。今すぐ使用する:http://stackoverflow.com/questions/27739833/adapt-tableview-menu-button(投稿vom Balage1551) – Hesk

0
// Step 1: Add a click listener to the table view. 
tableView.setOnMouseClicked(new EventHandler<>() { 

    @Override 
    public void handle(MouseEvent event) { 
    // Step 2: Get the height of the header. 
    double headerHeight = tableView.lookup(".column-header-background").getBoundsInLocal().getHeight(); 

    // Step 3: Check if the clicked position's Y value is less than or equal to the height of the header. 
    if (headerHeight <= event.getY()) { 
     // Clicked on the header! 
    } 
    } 
}); 
関連する問題