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);
}
}