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