2013-08-09 1 views
2

이 질문은 this question의 후속 조치입니다.메뉴 막대가 숨겨져있을 때 JMenuItem 단축키가 작동하지 않습니다.

저는 JMenuBar입니다. 그 행동은 Firefox와 iTunes의 메뉴 막대와 같습니다. 즉, 처음에는 메뉴 표시 줄이 숨겨져 있지만 Alt을 누르면 메뉴 표시 줄이 나타납니다.

다른 질문에 대한 답변은 해당 기능을 달성 문제를 해결하지만, 약 다른 문제를 가져온 다음 JMenuBar가 보이지 않을 때 JMenuItem 가속기가 작동하지 않습니다. 즉, CTRL+F (설치된 가속기)이 작동하기 전에 Alt을 눌러야합니다. setAccelerator() 방법은 상태 때문에

는하지만, 경우가 안되어 다음 :

메뉴 항목의 조치를 호출하는 키의 편성을 설정합니다

공공 무효 setAccelerator (KeyStroke를 keyStroke의) 메뉴 계층 구조를 탐색하지 않고도 리스너를 사용할 수 있습니다. 올바른 작업을 설치하는 것은 UI의 책임입니다. 키보드 가속기를 입력하면 현재 메뉴가 표시되는지 여부에 관계없이 작동합니다.

그래서 이것이 다른 자바 버그일까요?

SSCCE (메뉴가 나타날 때까지를 얻으려면, 당신은 Alt을 누르고, 설치된 가속기납니다 입력을위한 더미 JOptionPane하는 "찾기"에 대한 CTRL+F입니다) :

import javax.swing.JFrame; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JOptionPane; 
import javax.swing.KeyStroke; 
import javax.swing.MenuElement; 
import javax.swing.MenuSelectionManager; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.WindowConstants; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class MenuBarTest extends JFrame { 

    public MenuBarTest() { 
     JMenu jMenu1 = new JMenu(); 
     JMenu jMenu2 = new JMenu(); 
     final JMenuBar jMenuBar1 = new JMenuBar(); 
     JMenuItem jMenuItem1 = new JMenuItem(); 
     JMenuItem jMenuItem2 = new JMenuItem(); 

     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 

     jMenu1.setText("File"); 
     jMenuItem1.setText("jMenuItem1"); 
     jMenu1.add(jMenuItem1); 
     jMenuBar1.add(jMenu1); 
     jMenu2.setText("Edit"); 
     jMenuItem2.setText("Find"); 
     jMenu2.add(jMenuItem2); 
     jMenuBar1.add(jMenu2); 
     setJMenuBar(jMenuBar1); 

     jMenuBar1.setVisible(false); 
     ChangeListener listener = new ChangeListener() { 
      @Override 
      public void stateChanged(ChangeEvent e) { 
       MenuElement[] elements = MenuSelectionManager.defaultManager().getSelectedPath(); 
       jMenuBar1.setVisible(elements.length > 0 && elements[0] == jMenuBar1); 
      } 
     }; 
     MenuSelectionManager.defaultManager().addChangeListener(listener); 

     jMenuItem2.setAccelerator(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F, java.awt.event.InputEvent.CTRL_MASK)); 
     jMenuItem2.setText("Find"); 
     jMenuItem2.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       String what = JOptionPane.showInputDialog(MenuBarTest.this, "Search for what?"); 
       System.out.println(what); 
      } 
     }); 

     pack(); 
     setSize(500,500); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    public static void main(String args[]) { 
     try { 
      UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); 
     } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
      ex.printStackTrace(); 
     } 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new MenuBarTest(); 
      } 
     }); 
    } 
} 
+0

필자의 주장은 문서화 문제입니다. 여기에있는 "표시됨"은 menubar 만 볼 수 있기 때문에 menuBar 아래의 메뉴/항목이 숨겨져있는 일반적인 상태를 나타냅니다. 그럼에도 불구하고, 그것은 보입니다 (보이는 것이고 모든 조상이 보여주기 때문에). 바인딩이 작동하도록 허용합니다. – kleopatra

답변

3

신중

당신의 강조를 읽기

키보드 가속기를 입력하면 현재 메뉴가 표시되는지 여부에 관계없이 작동합니다.

이것은 메뉴없는 부모에 대해 이야기합니다. 의미가 메뉴는 현재 표시되지 않을 수 있습니다. 그럼에도 불구하고 현실적인 (아마도 지나치게 잘 문서화되지 않은) 바람직한 속성은 으로 표시되어야한다는 것입니다. 이전 질문에 대한 나의 대답이 업데이트되었습니다.

+0

와우. 마지막 질문과 마찬가지로 나는 내 생각에 그 일을 결코 생각하지 못했습니다. 이 커뮤니티는 진정으로 영재 개발자들로 가득합니다! – ryvantage

+0

오, 내가 자바를 얼마나 좋아하는지 ... 그래서, 나는'JMenuBar'를 확장하고 (Netbeans (예, GUI 빌더)에 새로운 클래스를 가져 오기 위해 시도한 (ok, 나에게 토마토를 던지지 말아라.) 나는이 재미를 만났다. 작은 세부 사항 :'JMenuBar' 메서드의 모든 것이 완료되지 않았습니다. 누군가 (get this) 1999 : http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4087846에서이 점에 대해 불평했으나 아직 수정되지 않았습니다. 이 버그의 명예에 "wtf"라는 제목의 블로그 기사가 작성되었습니다. 2006 년. http://tsareto.blogspot.com/2006/05/wtf.html. 따라서, 아직 JMenuBar.getHelpMenu()를 호출하지 말아라. 왜냐하면 자바가 아직 그것에 도달하지 않았기 때문이다. – ryvantage

+0

SSCCE : 'public static void main (String [] args) { JMenuBar bar = new JMenuBar(); bar.getHelpMenu(); }' – ryvantage

관련 문제