有没有一种简单的方法来检查是否在TableView中单击了列标题?

时间:2019-08-11 08:41:29

标签: javafx tableview

第一次来。谢谢你的帮助。 将Java 11与javafx一起用于Java 11。

我正在使用TableView,但无法确定是否单击了列标题而不是单击其中的一行。

具有下面一行内容可以解决该问题,因为我只希望它在双击并且所选项目不是标题的情况下执行。

(getClickCount() == 2) && notAHeader)

当前,即使单击标题,下面的行也将返回第一项或最后一项。

accountTable.getSelectionModel().getSelectedItem();  

如果单击标题后以下内容返回-1,则可以使用它来解决我的问题,但似乎只有在未选择任何内容时才返回。

accountTable.getSelectionModel().getFocusedIndex(); 

我尝试清除lambda末尾的选择。 这似乎可以正常工作,但只是在单击时闪烁选择内容,这不是我想要的行为。

我还尝试设置一个事件过滤器来监听点击,并确定我单击的内容包含任何标题的文本。该解决方案非常丑陋,但是具有我想要的行为。

accountTable.addEventFilter(MouseEvent.MOUSE_PRESSED, (EventHandler) event -> {
                if (event.getTarget().toString().contains("Display Name") ||
                        event.getTarget().toString().contains("Username") ||
                        event.getTarget().toString().contains("Email Address")) {
                    notAHeader= false;
                } else {
                    notAHeader= true;
                }
            });

用于配置表格的代码。

    private void configTable(TableView accountTable) {
        accountTable.setPlaceholder(new Label("Failed to load"));
        HashMap<String, String> columnHeaders = new HashMap<>();
        columnHeaders.put("Display Name", "displayName");
        columnHeaders.put("Username", "userLogonName");
        columnHeaders.put("Email Address", "emailAddress");
        columnHeaders.forEach((header, getter) -> {
                    TableColumn<String, ADAccount> column = new TableColumn<>(header);
                    column.setCellValueFactory(new PropertyValueFactory<>(getter));
                    accountTable.getColumns().add(column);
                }

        );
        accountTable.setOnMouseClicked(e -> {
            if (e.getClickCount() == 2) {
                //need this to be ignored if a column header ws clicked.
                openAccountDetails(getSelectedAccount(),getMode());
            }
        });
    }

我希望能够确定是否单击了列标题,因此我可以忽略打开帐户详细信息,因为列标题不是帐户。现在,我无法区分是单击列标题还是单击行,因为所选项目不会返回所选列标题的任何指示。

1 个答案:

答案 0 :(得分:0)

单击列标题后,将在排序之前调用onSort。 我使用onSort来清除选择,因为单击标题时什么也没有选择。

下面的行为我提供了我所需要的行为,而我没有发现任何副作用。

//clears the selection when the column header is selected before the sorting 
accountTable.setOnSort( e -> accountTable.getSelectionModel().clearSelection());