失去焦点时加速器命令不起作用
Accelerator commands not working when focus lost
我有以下 swing
申请,
其中有一个自定义 JMenuBar
。
代码如下,
public class MenuBarTest {
public static void main(String[] args) {
new JFXPanel();
final JFrame frame = new JFrame();
frame.setLayout(new BorderLayout());
frame.getContentPane().add(new JTextField("Testing", JLabel.CENTER),
BorderLayout.CENTER);
frame.setJMenuBar(new DummyMenuBar());
frame.setSize(300, 300);
frame.setVisible(true);
}
}
DummyMenuBar.java
public class DummyMenuBar extends JMenuBar {
private MenuBar menuBar;
private MenuItem menuItem;
public DummyMenuBar() {
try {
addToScene();
} catch (Exception e) {
}
}
private void addToScene() {
final JFXPanel menuFxPanel = new JFXPanel();
add(menuFxPanel);
Platform.setImplicitExit(false);
Platform.runLater(() -> {
Scene scene = new Scene(new VBox(), 400, 20);
initMenuItem();
((VBox) scene.getRoot()).getChildren().addAll(menuBar);
menuFxPanel.setScene(scene);
});
}
private void initMenuItem() {
menuBar = new MenuBar();
menuItem = new MenuItem("Item 1");
menuItem.setAccelerator(new KeyCodeCombination(KeyCode.S, KeyCombination.CONTROL_DOWN));
Menu menu1 = new Menu("Dummy 1");
menu1.getItems().add(menuItem);
menuBar.getMenus().add(menu1);
menuItem.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println(".handle()");
}
});
}
}
问题是,
加速器命令(Ctrl+S)仅在菜单栏有focus.If i单击 JTextField
(它获得焦点)和加速器命令
没用。
要使其再次运行,我必须再次单击 MenuBar
以获得焦点。
我可以关联它,因为我在 JmenuBar
(DummyMenuBar.java) 上添加了 JavaFX
项,但不确定确切的根本原因。
我该如何解决这个问题?
我使用 KeyBinding
、
解决了这个问题
public static void main(String[] args) {
new JFXPanel();
final JFrame frame = new JFrame();
frame.setLayout(new BorderLayout());
JTextField tf = new JTextField("Hello World");
frame.getContentPane().add(tf,
BorderLayout.CENTER);
tf.getInputMap((JComponent.WHEN_FOCUSED)).put(KeyStroke.getKeyStroke(KeyEvent.VK_S, KeyEvent.CTRL_DOWN_MASK), "Ctrl+S");
tf.getActionMap().put("Ctrl+S", new SaveAction());
frame.setJMenuBar(new DummyMenuBar());
frame.setSize(300, 300);
frame.setVisible(true);
}
static class SaveAction extends AbstractAction {
@Override
public void actionPerformed(java.awt.event.ActionEvent e) {
if((e.getSource() instanceof JTextField)){
System.out.println(".handle() in Action");
}
}
}
这确保即使在 JFXPanel
失焦时加速器也能正常工作。
我有以下 swing
申请,
其中有一个自定义 JMenuBar
。
代码如下,
public class MenuBarTest {
public static void main(String[] args) {
new JFXPanel();
final JFrame frame = new JFrame();
frame.setLayout(new BorderLayout());
frame.getContentPane().add(new JTextField("Testing", JLabel.CENTER),
BorderLayout.CENTER);
frame.setJMenuBar(new DummyMenuBar());
frame.setSize(300, 300);
frame.setVisible(true);
}
}
DummyMenuBar.java
public class DummyMenuBar extends JMenuBar {
private MenuBar menuBar;
private MenuItem menuItem;
public DummyMenuBar() {
try {
addToScene();
} catch (Exception e) {
}
}
private void addToScene() {
final JFXPanel menuFxPanel = new JFXPanel();
add(menuFxPanel);
Platform.setImplicitExit(false);
Platform.runLater(() -> {
Scene scene = new Scene(new VBox(), 400, 20);
initMenuItem();
((VBox) scene.getRoot()).getChildren().addAll(menuBar);
menuFxPanel.setScene(scene);
});
}
private void initMenuItem() {
menuBar = new MenuBar();
menuItem = new MenuItem("Item 1");
menuItem.setAccelerator(new KeyCodeCombination(KeyCode.S, KeyCombination.CONTROL_DOWN));
Menu menu1 = new Menu("Dummy 1");
menu1.getItems().add(menuItem);
menuBar.getMenus().add(menu1);
menuItem.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println(".handle()");
}
});
}
}
问题是,
加速器命令(Ctrl+S)仅在菜单栏有focus.If i单击 JTextField
(它获得焦点)和加速器命令
没用。
要使其再次运行,我必须再次单击 MenuBar
以获得焦点。
我可以关联它,因为我在 JmenuBar
(DummyMenuBar.java) 上添加了 JavaFX
项,但不确定确切的根本原因。
我该如何解决这个问题?
我使用 KeyBinding
、
public static void main(String[] args) {
new JFXPanel();
final JFrame frame = new JFrame();
frame.setLayout(new BorderLayout());
JTextField tf = new JTextField("Hello World");
frame.getContentPane().add(tf,
BorderLayout.CENTER);
tf.getInputMap((JComponent.WHEN_FOCUSED)).put(KeyStroke.getKeyStroke(KeyEvent.VK_S, KeyEvent.CTRL_DOWN_MASK), "Ctrl+S");
tf.getActionMap().put("Ctrl+S", new SaveAction());
frame.setJMenuBar(new DummyMenuBar());
frame.setSize(300, 300);
frame.setVisible(true);
}
static class SaveAction extends AbstractAction {
@Override
public void actionPerformed(java.awt.event.ActionEvent e) {
if((e.getSource() instanceof JTextField)){
System.out.println(".handle() in Action");
}
}
}
这确保即使在 JFXPanel
失焦时加速器也能正常工作。