【发布时间】:2017-02-24 10:20:31
【问题描述】:
有没有办法让鼠标点击表格的标题?
我为什么需要这个?
我有一个包含许多列的表格。但只有整个表格的特定宽度。 为了避免滚动,我想给每个列一个特定的宽度(50 左右),只要你点击一个标题,这个列就会展开,这样你就可以阅读内容。如果您单击另一个标题,则前一个标题会折叠。
希望有人可以帮助我:)
【问题讨论】:
-
检查我的答案。
有没有办法让鼠标点击表格的标题?
我为什么需要这个?
我有一个包含许多列的表格。但只有整个表格的特定宽度。 为了避免滚动,我想给每个列一个特定的宽度(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 0: call setOnShown(...).
stage.setOnShown(event -> {
setHeaderClickListeners(); // Call this method when the stage is shown.
});
然后你创建一个方法setHeaderClickListeners(),如下:
private void setHeaderClickListeners() {
// Step 1: Get the table header row.
TableHeaderRow headerRow = null;
for (Node n : ((TableViewSkin<?>) tableView.getSkin()).getChildren()) {
if (n instanceof TableHeaderRow) {
headerRow = (TableHeaderRow) n;
}
}
if (headerRow == null) {
return;
}
// Step 2: Get the list of the header columns.
NestedTableColumnHeader ntch = (NestedTableColumnHeader) headerRow.getChildren().get(1);
ObservableList<TableColumnHeader> headers = ntch.getColumnHeaders();
// Step 3: Add click listener to the header columns.
for (int i = 0; i < headers.size(); i++) {
TableColumnHeader header = headers.get(i);
final int index = i;
header.setOnMouseClicked(mouseEvent -> {
// Optional:
// Get the TableColumnBase (which is the object responsible
// for displaying the content of the column.)
TableColumnBase column = header.getTableColumn();
// Step 4: Handle double mouse click event.
if (mouseEvent.getButton() == MouseButton.PRIMARY && mouseEvent.getClickCount() == 2) {
P.x("Header cell " + index + " clicked! " + column.getText());
}
});
}
}
【讨论】: