JavaFX:硬编码“Ctrl + C”按键

时间:2017-05-23 20:29:43

标签: java javafx clipboard

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

有没有办法在Java中对此按键操作进行硬编码?我查看了 if (blog.likes.indexOf(req.user._id) > -1 ){ blog.likes.shift(req.user._id); blog.save(); } else { blog.likes.push(req.user); blog.save(); } 类,但实际上并没有触发给定组合键所描述的操作。

1 个答案:

答案 0 :(得分:3)

我认为"因为在任何给定的时间都可以选择任何或没有任何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);
    }
}