JavaFX:硬编码 "Ctrl+C" 按键
JavaFX: Hardcode a "Ctrl+C" keypress
我有一个 JavaFX 应用程序,在主框架中有各种 TextField
小部件。我有一个 MenuBar
,其中包含 MenuItem
对象 "Copy" 和 "Paste",就像标准生产应用程序一样。由于可以在任何给定时间选择各种 TextField
对象中的任何或 none,因此在 [=15] 中硬编码 "Ctrl+C" 或 "Ctrl+V" 按键似乎更容易=] "Copy" 和 "Paste" MenuItem
对象的事件,而不是使用 Clipboard
对象并循环遍历所有 TextFields
以查找突出显示的文本(如果有的话) ).
有没有办法在 Java 中硬编码这个按键动作?我查看了 KeyCombination
class 但它实际上并没有触发给定组合键所描述的操作。
我认为 "Since any or none of the various TextField
objects could be selected at any given time" 您指的是哪个(如果有的话)文本字段具有键盘焦点。
你可以很容易地从现场得到这些信息:做
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);
}
}
我有一个 JavaFX 应用程序,在主框架中有各种 TextField
小部件。我有一个 MenuBar
,其中包含 MenuItem
对象 "Copy" 和 "Paste",就像标准生产应用程序一样。由于可以在任何给定时间选择各种 TextField
对象中的任何或 none,因此在 [=15] 中硬编码 "Ctrl+C" 或 "Ctrl+V" 按键似乎更容易=] "Copy" 和 "Paste" MenuItem
对象的事件,而不是使用 Clipboard
对象并循环遍历所有 TextFields
以查找突出显示的文本(如果有的话) ).
有没有办法在 Java 中硬编码这个按键动作?我查看了 KeyCombination
class 但它实际上并没有触发给定组合键所描述的操作。
我认为 "Since any or none of the various TextField
objects could be selected at any given time" 您指的是哪个(如果有的话)文本字段具有键盘焦点。
你可以很容易地从现场得到这些信息:做
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);
}
}