Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关注第一个jmenubar项目;alt";按键_Java_Swing_Jmenu_Jmenubar_Alt Key - Fatal编程技术网

Java 关注第一个jmenubar项目;alt";按键

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”键时,有没有办法在我的jmenubar中自动选择jmenu?(如windows软件)

问题是,当按下“ALT”键时,我的jframe的默认行为是显示包含以下操作的菜单:还原、移动、大小、减少

我想让java应用程序做的是在按下“alt”时选择我的jmenu第一项。
(就像使用助记符:“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键展示你当前的问题。这应该是它自己的问题,并引用回这个问题,而不是这个问题的答案。