テーブルのヘッダをマウスでクリックする方法はありますか?JavaFX TableViewヘッダをクリック
なぜこれが必要ですか?
私は多くの列を持つテーブルを持っています。しかし、全体のテーブルのための特定のwitdth。 スクロールを避けるために、各列に特定の幅(50程度)を与えたいだけです。ヘッダーをクリックするだけでこの列が展開され、内容を読むことができます。別のヘッダーをクリックすると、前のヘッダーが折りたたまれます。
うまくいけば、誰かが私を助けることができます:)
テーブルのヘッダをマウスでクリックする方法はありますか?JavaFX TableViewヘッダをクリック
なぜこれが必要ですか?
私は多くの列を持つテーブルを持っています。しかし、全体のテーブルのための特定のwitdth。 スクロールを避けるために、各列に特定の幅(50程度)を与えたいだけです。ヘッダーをクリックするだけでこの列が展開され、内容を読むことができます。別のヘッダーをクリックすると、前のヘッダーが折りたたまれます。
うまくいけば、誰かが私を助けることができます:)
は、残念ながらこれを行うには良い方法はありません。唯一のパブリック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("");
}
// 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!
}
}
});
を呼び出すことも必要がありますが、動作しますので、デフォルトでは、列の並べ替えを実装するために、リスナーをクリックしたこと、あなたがこの動作を望んでいないようです。唯一の問題は、すべての列に対してイベントを作成したくないということです。イベント内で列インデックスを取得することは可能ですか? "X clicked"の代わりにsomething.getIndex()+ "clicked"が必要です。 – Hesk
@Hesk更新された回答を参照してください。私はすべてのノードが持っている共有プロパティのハンドラで取得したカスタムプロパティマップにインデックスを保存しました... – Adam
私は別の方法で私のテーブルを設計しました。今すぐ使用する:http://stackoverflow.com/questions/27739833/adapt-tableview-menu-button(投稿vom Balage1551) – Hesk