2016-09-20 26 views
2

我有以下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)只當Menubar有焦點。如果我點擊JTextField (它獲得焦點)和加速器命令 不起作用。

爲了使其再次工作,我必須再次單擊MenuBar以獲得焦點。

我可以聯繫它,因爲我已經通過JmenuBar(DummyMenuBar.java)添加了JavaFX項,但不確定確切的根本原因。

我該如何解決這個問題?

+0

您是否檢查過[this](http://stackoverflow.com/questions/28239019/javafx-accelerator-not-working-when-textfield-has-focus?rq=1) – Madhan

+0

@Madhan是的,我已經嘗試過,如果焦點不在'JFXPanel'上,它仍然不起作用。由於'JFXPanel'擴展了'JComponent',因此期望焦點捕捉關鍵事件。 – user3164187

回答

0

我做了工作中使用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失焦。