JavaFX TableView单击Header

时间:2017-02-24 10:20:31

标签: java javafx tableview

有没有办法鼠标点击桌子的标题?

为什么我需要这个?

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

希望有人可以帮助我:)。

2 个答案:

答案 0 :(得分:1)

不幸的是,这并不是一个很好的方法。唯一的公共API选项是替换" graphic"使用您自己的标签的列,然后添加一个鼠标侦听器。为此,您还需要清除任何现有的列文本。

请注意,默认情况下,列具有点击侦听器以实现排序,您似乎不希望出现此行为,因此您还需要调用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("");
}

答案 1 :(得分:0)

// 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());
      }
    });
  }
}