我在fxml
中有元素,并且我在onKeyPressed
那里设置了方法
<TableView fx:id="topTable" onKeyPressed="#copyToClipboard" prefHeight="200.0" prefWidth="200.0">
但我不明白如何从方法中的此 EventHandler 获取 KeyCode。
@FXML
private TableView<ObservableList<String>> topTable;
...
public void copyToClipboard(){
System.out.println(topTable.getOnKeyPressed().toString());
}
借助此操作,我想从 TableColumn
的单元格复制数据。
有人可以解释一下我可以使用 getOnKeyPressed
中的 Handler 做什么吗?
最佳答案
当您通过 FXML 添加事件处理程序时, Controller 中的方法可以不带任何参数,也可以带一个具有适当事件类型的参数。在您的情况下,由于您使用的是 onKeyPressed
,因此您可以像这样定义 Controller 方法:
public void copyToClipboard(KeyEvent event) {
if (event.isShortcutDown() && event.getCode() == KeyCode.C) {
Clipboard cp = Clipboard.getSystemClipboard();
// add your data to the clipboard
}
}
了解更多信息:
- Javadoc
Clipboard
- controller event handler methods 的文档
要了解参数应属于哪种Event
类型,请查看您尝试使用的事件处理程序属性。在您的问题中,您设置 onKeyPressed
property通过 FXML。该属性具有以下签名:
ObjectProperty<EventHandler<? super KeyEvent>>
EventHandler
应该处理的 Event
类型在 EventHandler
的通用类型中声明;在本例中为KeyEvent
。
有许多为 Node
声明的“事件处理程序属性”。某些子类将添加自己的属性,例如 ButtonBase
的 onAction
属性(使用 ActionEvent
)。
如果有帮助,您可以考虑从 FXML 设置事件处理程序属性,就像使用方法引用一样*:
public class Controller {
@FXML private TableView<?> topTable;
@FXML
private void initialize() {
topTable.setOnKeyPressed(this::copyToClipboard);
}
public void copyToClipboard(KeyEvent event) {}
}
* 实际上情况并非如此,因为 FXMLLoader
所做的事情更为复杂(反射)。
关于java - 从 getOnKeyPressed 处理 EventHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52454459/