2017-02-24 96 views
1

有没有办法让鼠标点击表头?JavaFX TableView点击标题

为什么我需要这个?

我有许多列的表。但是整个表只有一个特定的智慧。 为了避免滚动,我想给每个列一个特定的宽度(50左右),只要你点击一个标题,这个列将扩大,所以你可以阅读的内容。如果您点击另一个标题,则前一个标题会折叠。

希望有人能帮助我:)

回答

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(""); 
} 
+0

心不是很好,但会工作。现在唯一的问题是我不想为每一列制作一个事件。是否有可能获得事件内的列索引?而不是“X点击”我需要something.getIndex()+“点击”。 – Hesk

+0

@Hesk查看更新后的答案。我已经在每个节点都有的自定义属性映射中存储了一个索引,然后在共享事件处理程序中检索到该索引... – Adam

+0

我以另一种方式设计了我的表。现在使用这个:http://stackoverflow.com/questions/27739833/adapt-tableview-menu-button(Post vom Balage1551) – Hesk

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