第一次来。谢谢你的帮助。 将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());
}
});
}
我希望能够确定是否单击了列标题,因此我可以忽略打开帐户详细信息,因为列标题不是帐户。现在,我无法区分是单击列标题还是单击行,因为所选项目不会返回所选列标题的任何指示。
答案 0 :(得分:0)
单击列标题后,将在排序之前调用onSort。 我使用onSort来清除选择,因为单击标题时什么也没有选择。
下面的行为我提供了我所需要的行为,而我没有发现任何副作用。
//clears the selection when the column header is selected before the sorting
accountTable.setOnSort( e -> accountTable.getSelectionModel().clearSelection());