从getOnKeyPressed处理EventHandler

时间:2018-09-22 07:22:23

标签: java javafx event-handling keypress

我在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吗?

1 个答案:

答案 0 :(得分:1)

通过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>>

Event应该处理的EventHandler类型是在EventHandler的通用类型中声明的;在这种情况下,KeyEvent

Node声明了许多“事件处理程序属性”。一些子类将添加自己的子类,例如onAction的{​​{1}}属性(使用ButtonBase)。

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

ActionEvent

*实际上并非如此,因为public class Controller { @FXML private TableView<?> topTable; @FXML private void initialize() { topTable.setOnKeyPressed(this::copyToClipboard); } public void copyToClipboard(KeyEvent event) {} } 的操作更为复杂(反射)。