从 getOnKeyPressed 处理 EventHandler

process EventHandler from getOnKeyPressed

我在 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 添加事件处理程序时,控制器中的方法可以不采用任何参数,也可以采用具有适当事件类型的一个参数。在您的情况下,由于您使用的是 onKeyPressed,您可以像这样定义控制器方法:

public void copyToClipboard(KeyEvent event) {
    if (event.isShortcutDown() && event.getCode() == KeyCode.C) {
        Clipboard cp = Clipboard.getSystemClipboard();
        // add your data to the clipboard
    }    
}

更多信息:


要知道参数应该是哪种 Event 类型,请查看您尝试使用的事件处理程序 属性。在您的问题中,您正在通过 FXML 设置 onKeyPressed property 。此 属性 具有以下签名:

ObjectProperty<EventHandler<? super KeyEvent>>

EventHandler 应该处理的 Event 的类型在 EventHandler 的泛型类型中说明;在这种情况下,KeyEvent.

其中有许多 "event handler properties" 为 Node 申报。一些子类将添加自己的子类,例如 ButtonBaseonAction 属性(使用 ActionEvent)。

如果有帮助,您可以考虑从 FXML 设置事件处理程序属性,类似于使用方法引用*:

public class Controller {

    @FXML private TableView<?> topTable;

    @FXML
    private void initialize() {
        topTable.setOnKeyPressed(this::copyToClipboard);
    }

    public void copyToClipboard(KeyEvent event) {}

}

* 实际情况并非如此,因为 FXMLLoader 所做的更复杂(反射)。