2016-09-20 8 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をクリックしてフォーカスを得る必要があります。

JavaFXJmenuBar(DummyMenuBar.java)以上のアイテムに追加しましたが、正確な根本原因が不明なため、関連付けることができます。

どうすればこの問題を解決できますか?

+0

[これ](http://stackoverflow.com/questions/28239019/javafx-accelerator-not-working-when-textfield-has-focus?rq=1)をチェックしました – Madhan

+0

@Madhanはい私は試しましたが、フォーカスが 'JFXPanel'になければ、まだ動作しません。 'JFXPanel'は 'JComponent'を継承しているので、キーイベントをキャプチャするためにフォーカスが必要です。 – user3164187

答えて

0

私はこのメイド必ず、アクセルがJFXPanelは焦点が合っていない場合でも働いていた、

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

KeyBindingを使用して周りに仕事をしました。

関連する問題