【问题标题】:JavaFX TableView Click on HeaderJavaFX TableView 单击标题
【发布时间】:2017-02-24 10:20:31
【问题描述】:

有没有办法让鼠标点击表格的标题?

我为什么需要这个?

我有一个包含许多列的表格。但只有整个表格的特定宽度。 为了避免滚动,我想给每个列一个特定的宽度(50 左右),只要你点击一个标题,这个列就会展开,这样你就可以阅读内容。如果您单击另一个标题,则前一个标题会折叠。

希望有人可以帮助我:)

【问题讨论】:

  • 检查我的答案。

标签: java javafx tableview


【解决方案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("");
}

【讨论】:

  • 不太好,但可以。现在唯一的问题是我不想为每一列都做一个事件。是否可以在事件中获取列索引?而不是“X clicked”我需要something.getIndex() +“clicked”。
  • @Hesk 查看更新的答案。我在每个节点都有的自定义属性映射中存储了一个索引,然后在共享事件处理程序中检索...
  • 我用另一种方式设计了我的桌子。现在使用这个:stackoverflow.com/questions/27739833/… (Post vom Balage1551)
【解决方案2】:
// 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());
      }
    });
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 2012-09-12
    • 2018-04-04
    • 2015-06-24
    • 2014-10-21
    • 2021-09-07
    • 1970-01-01
    相关资源
    最近更新 更多