Java Swing 按键事件基础

发布于 11-05 03:26 字数 183 浏览 9 评论 0原文

在我的一个菜单中,一个菜单项的快捷键是

Ctrl+Greater

代码是 KeyEvent.VK_GREATER、Event.CTRL_MASK

但是当我按 Ctrl+更大它不起作用...... 有人可以建议一下吗?

In one of my menus, one menuItem's shortcut key is

Ctrl+Greater

code for that is KeyEvent.VK_GREATER, Event.CTRL_MASK

but when I press Ctrl+Greater it's not working....
Can any one please suggest?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

睫毛溺水了2024-11-12 03:26:53

以为这个相当老的麻烦已经被修复了..显然没有;-)

在过去,只有使用具有 VK_Something 的 keyStrokes 才是安全的,并且在美式键盘布局上无需使用 Shift 键即可访问 Something。这意味着,使用键绑定到位置(没有移位甚至通过 gr)与该基础不同的键,要么高度依赖键盘布局,要么高度不稳定 - 最好不要使用。

   // technical binding to "Greater" on a German keyboard  
   other.setAccelerator(KeyStroke.getKeyStroke("control shift LESS"));

   // BUT ... not really, its localized description is
   Str-Umschalt-Kleiner als

Thought this rather old nuisance had been fixed .. obviously not ;-)

In the ol' days, it was only safe to use keyStrokes which have VK_Something with Something being accessible without shift on an american keyboard layout. That means, using keybinding to keys which have positions (w/out shift or even via gr) different from that base, is either highly keyboard layout dependent or highly unstable - better don't use.

   // technical binding to "Greater" on a German keyboard  
   other.setAccelerator(KeyStroke.getKeyStroke("control shift LESS"));

   // BUT ... not really, its localized description is
   Str-Umschalt-Kleiner als
蒗幽2024-11-12 03:26:53

查看我的代码。这里一切都很好。

这个例子并不适合这个问题,但我首先给出了它并且(为此而被唠叨)因此它留在这里供参考。对于适当的一个,即在菜单项上设置加速器,请参阅下面的 EDIT1。

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class CtrlGreaterTestInaccurateAnswer extends JFrame
{
    private static final long serialVersionUID = 1L;
    private KeyListener kL = new KeyAdapter()
    {
        @Override
        public void keyReleased(KeyEvent e)
        {
            super.keyReleased(e);
        System.out.println("keyReleased KeyEvent.VK_GREATER=" + KeyEvent.VK_GREATER
                + "; e.getKeyCode()=" + e.getKeyCode()
                + "; e.getKeyChar()=" + e.getKeyChar()
                + "; e.isControlDown()=" + e.isControlDown()
                + "; e.isShiftDown()=" + e.isShiftDown() 
                + "; (int)'.'="+(int)'.' +"; (int)'>'="+(int)'>');
        if(e.isControlDown()    && e.getKeyChar() == '>')
            System.out.println("keyReleased ctrl + greater");
        }
    };

    public CtrlGreaterTestInaccurateAnswer()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        addKeyListener(kL);
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                CtrlGreaterTestInaccurateAnswer f = new CtrlGreaterTestInaccurateAnswer();
                f.setSize(400, 400);
                f.setVisible(true);
            }
        });
    }
}

根据我观察到的 KeyEvent.VK_GREATER 返回 160,并且按“>”时返回的代码是 46,即与按“.”相同。因此,如果您使用 getKeyCode 方法进行检测,则会出现问题。

EDIT1(适当的例子):
设置快捷键 CTRL + >。请注意,加速器仍然会显示 Ctrl+Shift-PERIOD (Ctrl+Shift+。)

import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;

public class CtrlGreaterTest extends JFrame
{
    private static final long serialVersionUID = 1L;

    public CtrlGreaterTest()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JMenuBar menuBar = new JMenuBar();
        JMenu menu1 = new JMenu("Menu1");
        JMenuItem menuItem1 = new JMenuItem();
        menuItem1.setAction(onCtrlGreaterAction);
        menuItem1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_PERIOD, 
                KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK));         
        //or use this
        //menuItem1.setAccelerator(KeyStroke.getKeyStroke("ctrl shift PERIOD"));
        menu1.add(menuItem1);

        JMenuItem menuItem2 = new JMenuItem();
        menuItem2.setAction(onCtrlAAction);
        menuItem2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, 
                KeyEvent.CTRL_MASK)); 

        System.out.println("KeyEvent.VK_PERIOD| KeyEvent.SHIFT_MASK="
                +(KeyEvent.VK_PERIOD| KeyEvent.SHIFT_MASK)
                + "; KeyEvent.VK_GREATER="+(KeyEvent.VK_GREATER) 
                + "; (int)'>'="+(int)'>');
        menu1.add(menuItem2);       
        menuBar.add(menu1);
        setJMenuBar(menuBar);
    }
    private AbstractAction onCtrlGreaterAction = new AbstractAction("CTRL + > Action")
    {
        private static final long serialVersionUID = 1L;

        @Override
        public void actionPerformed(ActionEvent e)
        {
            System.out.println("onCtrlGreaterAction actionPerformed OI");
        }
    };

    private AbstractAction onCtrlAAction = new AbstractAction("CTRL + a Action")
    {
        private static final long serialVersionUID = 1L;

        @Override
        public void actionPerformed(ActionEvent e)
        {
            System.out.println("onCtrlAAction actionPerformed AI");
        }
    };

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                CtrlGreaterTest f = new CtrlGreaterTest();
                f.setSize(400, 400);
                f.setVisible(true);
            }
        });
    }
}

希望就是这样:)

Check out my code. Here all is fine.

THIS example is not appropriate to the problem but I gave it first and (was nagged for it) thus it is left here for reference. For the appropriate one, i.e. setting accelerator on a menu item, please see EDIT1 below.

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class CtrlGreaterTestInaccurateAnswer extends JFrame
{
    private static final long serialVersionUID = 1L;
    private KeyListener kL = new KeyAdapter()
    {
        @Override
        public void keyReleased(KeyEvent e)
        {
            super.keyReleased(e);
        System.out.println("keyReleased KeyEvent.VK_GREATER=" + KeyEvent.VK_GREATER
                + "; e.getKeyCode()=" + e.getKeyCode()
                + "; e.getKeyChar()=" + e.getKeyChar()
                + "; e.isControlDown()=" + e.isControlDown()
                + "; e.isShiftDown()=" + e.isShiftDown() 
                + "; (int)'.'="+(int)'.' +"; (int)'>'="+(int)'>');
        if(e.isControlDown()    && e.getKeyChar() == '>')
            System.out.println("keyReleased ctrl + greater");
        }
    };

    public CtrlGreaterTestInaccurateAnswer()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        addKeyListener(kL);
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                CtrlGreaterTestInaccurateAnswer f = new CtrlGreaterTestInaccurateAnswer();
                f.setSize(400, 400);
                f.setVisible(true);
            }
        });
    }
}

From what I have observed KeyEvent.VK_GREATER returns 160, and the code returned when pressing '>' is 46, i.e. the same as pressing '.'. Thus, if you use the getKeyCode method for detection you have a problem here.

EDIT1 (Appropriate example):
Setting accelerator for CTRL + >. Please notice that still the accelerator will say Ctrl+Shift-PERIOD (Ctrl+Shift+.)

import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;

public class CtrlGreaterTest extends JFrame
{
    private static final long serialVersionUID = 1L;

    public CtrlGreaterTest()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JMenuBar menuBar = new JMenuBar();
        JMenu menu1 = new JMenu("Menu1");
        JMenuItem menuItem1 = new JMenuItem();
        menuItem1.setAction(onCtrlGreaterAction);
        menuItem1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_PERIOD, 
                KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK));         
        //or use this
        //menuItem1.setAccelerator(KeyStroke.getKeyStroke("ctrl shift PERIOD"));
        menu1.add(menuItem1);

        JMenuItem menuItem2 = new JMenuItem();
        menuItem2.setAction(onCtrlAAction);
        menuItem2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, 
                KeyEvent.CTRL_MASK)); 

        System.out.println("KeyEvent.VK_PERIOD| KeyEvent.SHIFT_MASK="
                +(KeyEvent.VK_PERIOD| KeyEvent.SHIFT_MASK)
                + "; KeyEvent.VK_GREATER="+(KeyEvent.VK_GREATER) 
                + "; (int)'>'="+(int)'>');
        menu1.add(menuItem2);       
        menuBar.add(menu1);
        setJMenuBar(menuBar);
    }
    private AbstractAction onCtrlGreaterAction = new AbstractAction("CTRL + > Action")
    {
        private static final long serialVersionUID = 1L;

        @Override
        public void actionPerformed(ActionEvent e)
        {
            System.out.println("onCtrlGreaterAction actionPerformed OI");
        }
    };

    private AbstractAction onCtrlAAction = new AbstractAction("CTRL + a Action")
    {
        private static final long serialVersionUID = 1L;

        @Override
        public void actionPerformed(ActionEvent e)
        {
            System.out.println("onCtrlAAction actionPerformed AI");
        }
    };

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                CtrlGreaterTest f = new CtrlGreaterTest();
                f.setSize(400, 400);
                f.setVisible(true);
            }
        });
    }
}

Hope this is it :)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文