我有一个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();
}
类,但实际上并没有触发给定组合键所描述的操作。
答案 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);
}
}