JavaFX: Hardcode - клавиша "Ctrl + C"

2 jshapy8 [2017-05-23 23:29:00]

У меня есть приложение JavaFX, которое имеет различные виджеты TextField в основном фрейме. У меня есть MenuBar который включает в себя объекты MenuItem "Копировать" и "Вставить", как стандартное производственное приложение. Поскольку любой или любой из различных объектов TextField можно было выбрать в любой момент времени, кажется, проще просто setOnAction "Ctrl + C" или "Ctrl + V" в событиях setOnAction "Копировать" и "Вставить", Объекты MenuItem а не использовать объект Clipboard и циклически повторяют все текстовые TextFields чтобы найти выделенный текст (если есть).

Есть ли способ жестко указать это действие нажатия клавиши в Java? Я заглянул в класс KeyCombination но на самом деле не вызывает действие, описанное данной комбинацией клавиш.

java clipboard javafx


1 ответ


3 Решение James_D [2017-05-23 23:51:00]

Я думаю, что "поскольку любой или любой из объектов 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);
    }
}