JavaFX:hardcodea";Ctrl+;";按键

JavaFX:hardcodea";Ctrl+;";按键,java,javafx,clipboard,Java,Javafx,Clipboard,我有一个JavaFX应用程序,在主框架中有各种TextField小部件。我有一个菜单栏,它包括菜单项对象“复制”和“粘贴”,就像标准生产应用程序一样。由于在任何给定时间都可以选择各种文本字段对象中的任何一个或任何一个,因此在“复制”和“粘贴”的设置操作事件中只需硬编码“Ctrl+C”或“Ctrl+V”键似乎更容易MenuItem对象,而不是使用Clipboard对象并循环遍历所有TextFields以查找突出显示的文本(如果有) 有没有办法用Java硬编码这个按键动作?我查看了KeyCombin

我有一个JavaFX应用程序,在主框架中有各种
TextField
小部件。我有一个
菜单栏
,它包括
菜单项
对象“复制”和“粘贴”,就像标准生产应用程序一样。由于在任何给定时间都可以选择各种
文本字段
对象中的任何一个或任何一个,因此在“复制”和“粘贴”的
设置操作
事件中只需硬编码“Ctrl+C”或“Ctrl+V”键似乎更容易
MenuItem
对象,而不是使用
Clipboard
对象并循环遍历所有
TextFields
以查找突出显示的文本(如果有)

有没有办法用Java硬编码这个按键动作?我查看了
KeyCombination
类,但它实际上并没有触发给定组合键所描述的操作。

我认为“因为在任何给定时间都可以选择任何
TextField
对象”,您指的是哪个(如果有的话)文本字段具有键盘焦点

你可以很容易地从场景中获得这些信息:只需做

Node focusOwner = scene.getFocusOwner();
if (focusOwner instanceof TextField) {
    TextField textField = (TextField) focusOwner ;
    String selectedText = textField.getSelectedText();
    // ...
}
还请注意,
TextInputControl
定义了一个将所选文本复制到系统剪贴板的
copy()
方法。(类似地,还有一个
paste()
方法。)因此,您可以利用这些方法简化功能

这里有一个SSCCE:

import javafx.application.Application;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TextField;
import javafx.scene.control.TextInputControl;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class FocusMenuTest extends Application {

    @Override
    public void start(Stage primaryStage) {
        BorderPane root = new BorderPane();
        VBox textFields = new VBox(5, new TextField("One"), new TextField("Two"), new TextField("Three"));
        MenuBar menuBar = new MenuBar();
        Menu edit = new Menu("Edit");
        MenuItem copy = new MenuItem("Copy");

        copy.setOnAction(e -> {
            Node focusOwner = menuBar.getScene().getFocusOwner();
            if (focusOwner instanceof TextInputControl) {
                ((TextInputControl)focusOwner).copy();
            }
        });     

        MenuItem paste = new MenuItem("Paste");
        paste.setOnAction(e -> {
            Node focusOwner = menuBar.getScene().getFocusOwner();
            if (focusOwner instanceof TextInputControl) {
                ((TextInputControl)focusOwner).paste();
            }
        });

        menuBar.getMenus().add(edit);
        edit.getItems().addAll(copy, paste);
        root.setCenter(textFields);
        root.setTop(menuBar);
        Scene scene = new Scene(root, 400, 400);


        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

硬编码a
Ctrl+C
按键???遍历字段?你能解释一下你的意思吗???(自己在
TextField
或类似的东西的子节点上触发一个键事件???)我想我已经很好地解释了这个问题,但下面是伪代码:
Clipboard.execute(“Ctrl+C”)
。是的,另一种解决方案是将所有
TextField
对象放在一个数组中,使用
getSelected()
属性在数组中迭代查找第一个
TextField
。Text field没有
getSelected()
方法。你指的是焦点吗?我相信
getSelectedText()
是将返回高亮显示文本的
TextField
方法。我只是想知道我是否可以将Ctrl+C作为命令触发。非常感谢。