JavaFX TableView点击标题
问题描述:
有没有办法让鼠标点击表头?JavaFX TableView点击标题
为什么我需要这个?
我有许多列的表。但是整个表只有一个特定的智慧。 为了避免滚动,我想给每个列一个特定的宽度(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点击”我需要something.getIndex()+“点击”。 – Hesk
@Hesk查看更新后的答案。我已经在每个节点都有的自定义属性映射中存储了一个索引,然后在共享事件处理程序中检索到该索引... – Adam
我以另一种方式设计了我的表。现在使用这个:http://*.com/questions/27739833/adapt-tableview-menu-button(Post vom Balage1551) – Hesk