Java 关注第一个jmenubar项目;alt";按键
当用户按下“ALT”键时,有没有办法在我的jmenubar中自动选择jmenu?(如windows软件) 问题是,当按下“ALT”键时,我的jframe的默认行为是显示包含以下操作的菜单:还原、移动、大小、减少 我想让java应用程序做的是在按下“alt”时选择我的jmenu第一项。Java 关注第一个jmenubar项目;alt";按键,java,swing,jmenu,jmenubar,alt-key,Java,Swing,Jmenu,Jmenubar,Alt Key,当用户按下“ALT”键时,有没有办法在我的jmenubar中自动选择jmenu?(如windows软件) 问题是,当按下“ALT”键时,我的jframe的默认行为是显示包含以下操作的菜单:还原、移动、大小、减少 我想让java应用程序做的是在按下“alt”时选择我的jmenu第一项。 (就像使用助记符:“alt+f”)使用JComponent的actionmap和inputmap来完成这项工作。由于JFrame不是JComponent的后代,我建议您将JPanel添加到JFrame中,然后 Ac
(就像使用助记符:“alt+f”)使用JComponent的actionmap和inputmap来完成这项工作。由于JFrame不是JComponent的后代,我建议您将JPanel添加到JFrame中,然后
Action action = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
jMenu1.doClick();
}
};
jPanel1.getActionMap().put("myAction", action);
jPanel1.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ALT, KeyEvent.ALT_DOWN_MASK), "myAction");
将操作添加到
JRootPane
的ActionMap
和InputMap
。见下文:
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
public class MenuExample {
private void setupMenuKey(final JFrame frame) {
Action menuAction = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
JRootPane rootPane = frame.getRootPane();
JMenuBar jMenuBar = rootPane.getJMenuBar();
JMenu menu = jMenuBar.getMenu(0);
menu.doClick();
}
};
JRootPane rootPane = frame.getRootPane();
ActionMap actionMap = rootPane.getActionMap();
final String MENU_ACTION_KEY = "expand_that_first_menu_please";
actionMap.put(MENU_ACTION_KEY, menuAction);
InputMap inputMap = rootPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ALT, 0, true), MENU_ACTION_KEY);
}
private JFrame build() {
JFrame frame = new JFrame("Hello");
frame.setSize(300, 300);
JMenuBar bar = new JMenuBar();
List<String> letters = Arrays.asList("A", "B", "C");
for (int i = 0; i < 3; i++) {
JMenu menu = new JMenu("Menu " + i);
for (String string : letters) {
menu.add(new JMenuItem(String.format("Menu %s - %s", i, string)));
}
bar.add(menu);
}
frame.setJMenuBar(bar);
JButton b = new JButton("click");
JPanel p = new JPanel();
p.add(b);
frame.add(p);
setupMenuKey(frame);
return frame;
}
public static void main(String[] args) {
MenuExample menuExample = new MenuExample();
JFrame frame = menuExample.build();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
导入java.awt.event.*;
导入java.util.*;
导入javax.swing.*;
公共类菜单示例{
专用void setupMenuKey(最终JFrame){
Action menuAction=new AbstractAction(){
@凌驾
已执行的公共无效操作(操作事件e){
JRootPane rootPane=frame.getRootPane();
JMenuBar JMenuBar=rootPane.getJMenuBar();
JMenu menu=jMenuBar.getMenu(0);
menu.doClick();
}
};
JRootPane rootPane=frame.getRootPane();
ActionMap ActionMap=rootPane.getActionMap();
最终字符串菜单\u操作\u键=“请先展开该菜单”;
actionMap.put(菜单动作键,菜单动作);
InputMap InputMap=rootPane.getInputMap(JComponent.WHEN_FOCUSED_组件的祖先_);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK\u ALT,0,true),MENU\u ACTION\u键);
}
私有JFrame构建(){
JFrame=newjframe(“你好”);
框架。设置尺寸(300300);
JMenuBar=新的JMenuBar();
列表字母=数组;
对于(int i=0;i<3;i++){
JMenu菜单=新JMenu(“菜单”+i);
for(字符串:字母){
添加(新的JMenuItem(String.format(“菜单%s-%s”,i,String));
}
添加(菜单);
}
frame.setJMenuBar(bar);
JButton b=新JButton(“单击”);
JPanel p=新的JPanel();
p、 添加(b);
框架。添加(p);
setupMenuKey(框架);
返回框;
}
公共静态void main(字符串[]args){
MenuExample MenuExample=新建MenuExample();
JFrame=menuExample.build();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
我发现响应非常有用,但也有一个缺点
想象一下,您正在使用跨平台的L&F(金属),并且您已经为所有菜单定义了助记符;您知道,这些菜单是在按下时调用的。因此,如果我们将black panda提供的解决方案放在按下按钮的结果上,我们首先会看到所需的菜单部署,但在切换到第一个菜单后会立即看到
我认为最好的方法是按ALT键,只选择第一个菜单,但不显示其内容(这些内容应该在按下向下键时显示)。在跨平台L&F中有没有办法做到这一点
或者,还有另一种不需要任何额外代码就可以继续的方法。如果我们调用系统L&F(在我的例子中是Windows),ALT键的行为符合要求。有关详细信息,请参阅stackoverflow问题13474555。我刚刚使用
frame.setJMenuBar(jmenubar)找到了它
其中frame
是您的JFrame,jmenubar
是您的jmenubar,它将自动执行此操作。您甚至不必将其添加到布局管理器。在我使用的Windows应用程序(以及在Java应用程序中)上,使用Alt+Space时,将显示包含“还原、移动、大小…”操作的系统菜单。在我的windows应用程序上,如果我只使用Alt,则在释放Alt键(未按下)时,菜单栏上的第一个菜单将高亮显示。所以你的行为和要求似乎都不标准。用Alt键展示你当前的问题。这应该是它自己的问题,并引用回这个问题,而不是这个问题的答案。