2016-09-20 5 views
2

Ich habe die folgende swing Anwendung,Accelerator-Befehle funktionieren nicht, wenn der Fokus verloren

, die eine maßgeschneiderte JMenuBar hat.

Der folgende Code ist

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

Die Frage geht, Die Beschleuniger Befehle (Strg + S) funktioniert nur, wenn die Menüleiste hat Fokus.Wenn ich auf die JTextField klicken (es erhält Fokus) und Beschleunigerbefehle funktioniert nicht.

Damit es wieder funktioniert muss ich noch einmal auf den MenuBar klicken um den Fokus zu bekommen.

Ich kann es beziehen, weil ich JavaFX Artikel über JmenuBar (DummyMenuBar.java) hinzugefügt habe, aber nicht sicher über genaue Ursache.

Wie kann ich das lösen?

+0

Haben Sie überprüft [this] (http://stackoverflow.com/questions/28239019/javafx-accelerator-not-working-when-textfield-has-focus?rq=1) – Madhan

+0

@Madhan Ja, ich habe versucht, Es funktioniert immer noch nicht, wenn der Fokus nicht auf "JFXPanel" liegt. Da 'JFXPanel' 'JComponent' erweitert, erwartet es, dass der Fokus Schlüsselereignisse erfasst. – user3164187

Antwort

0

habe ich eine Arbeit um mit 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"); 
      } 
     } 
    } 

Dies stellte sicher, Beschleuniger selbst gearbeitet, als JFXPanel unscharf ist.

Verwandte Themen