2014-08-29 3 views
1

내 프로그램에 JMenuItem이있는 JMenuBar이 있습니다. 그들은 ActionListener을 가지고 있으며 setAccelerator으로 바로 가기를 설정했습니다. 이제 창에 초점이 맞춰지면 표시되는 이미지에 더 많은 공간을 확보하기 위해 메뉴 모음을 숨 깁니다. 그러나 메뉴 모음을 처음 숨긴 후에 바로 가기 키가 작동을 멈 춥니 다.보이지 않는 JMenuBar, Accelerator가 작동하지 않습니다.

어떻게 해결할 수 있습니까? 참고로

import javax.swing.*; 
import java.awt.event.*; 

class Example extends JFrame{ 
    public static void main(String[] args) { 
     new Example(); //main is static 
    } 
    static JMenuBar menubar; //be accessable for the ActionListener 
    Example() { 
     //JPanel 
     this.setSize(50,50); 
     this.setVisible(true); 

     //Menubar, static 
     menubar = new JMenuBar(); 
     this.setJMenuBar(menubar); 

     //Menu 
     JMenu filemenu = new JMenu("File"); 
     menubar.add(filemenu); 

     //Item 
     JMenuItem menuitem = new JMenuItem("Do Something..."); 
     filemenu.add(menuitem); 
     menuitem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D, KeyEvent.SHIFT_DOWN_MASK)); // Shift + D 
     menuitem.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       System.out.println("Action!"); 
      } 
     }); 

     JButton button = new JButton("Show/Hide menubar"); 
     this.add(button); 
     button.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       System.out.println("Toggle Bar!"); 
       menubar.setVisible(!menubar.isVisible()); //Toggle 
      } 
     }); 
    } 
} 

: 나는 자바 1.7.0_60-개를 사용하고 있습니다 (자바 7) Mac에서

는 그 이상한 행동을 설명하기 위해 약간의 예제 코드를 만들었습니다. 그러나이 오류는 Mac 기본 메뉴 표시 줄 또는 JFrame 내부의 일반 Java 메뉴 표시 줄을 사용하는 것과 관계없이 발생합니다.

답변

1

전역 키 바인딩을 추가 할 수 있습니다. 키 바인딩을 추가하는 방법은 here입니다. 그것은 단지 초점을 맞춘 윈도우에서 작동

//Any component that is always visible in the window (like the image) 
JComponent c; 
//Get input and action map 
InputMap imap = c.getInputMap(WHEN_IN_FOCUSED_WINDOW); 
ActionMap amap = c.getActionMap(); 
//Put keybinding and action 
imap.put(KeyStroke.getKeyStroke("shift D"), "doSomething"); 
amap.put("doSomething", anAction); 

참고 : 여기에

당신이 무엇을 할 수 있는지의 예입니다. 그러나 눈에 보이는 메뉴 바에 관계없이 작동해야합니다.