【问题标题】:setMnemonic() and call a method by pressing the keysetMnemonic() 并通过按键调用方法
【发布时间】:2014-06-08 17:43:08
【问题描述】:

按下 Alt+H

键时我必须手动运行方法
if("The key pressed==(Alt+H)"){
    callMethod();
}

public void callMethod(){
    //Some codes here
}

我如何在 Java 中真正做到这一点。请给我一个简单的方法来做到这一点。

【问题讨论】:

    标签: java swing key pressed mnemonics


    【解决方案1】:

    关于Oracle Tutorial - Enabling Keyboard Operation 的内容值得在这里阅读,其中将与示例一起进行详细说明。

    阅读更多关于Oracle Tutorial - How to Use Key Bindings

    直接来自上述教程的一些示例:

    //Setting the mnemonic when constructing a menu item:
    menuItem = new JMenuItem("A text-only menu item",
                         KeyEvent.VK_H);
    
    //Setting the mnemonic after creation time:
    menuItem.setMnemonic(KeyEvent.VK_H);
    
    //Setting the accelerator:
    menuItem.setAccelerator(KeyStroke.getKeyStroke(
        KeyEvent.VK_H, ActionEvent.ALT_MASK));
    

    在此处阅读更多信息Oracle Tutorial - How to Use Buttons, Check Boxes, and Radio Buttons

    示例代码:(Alt-H 会点击中间按钮)

    JButton b2 = new JButton("Middle button", middleButtonIcon);
    b2.setMnemonic(KeyEvent.VK_H);
    

    【讨论】:

    • 感谢我的荣幸。 :)
    【解决方案2】:

    如果使用菜单,那么您可以使用setMnemonic(),有关示例,请参见How to Use Menus。另一种选择是使用Key Bindings。例如:

    import java.awt.event.*;
    import javax.swing.*;
    
    public class TestKeys {
        private static void createAndShowGUI() {
            final JFrame frame = new JFrame("Keys");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            KeyStroke escapeKeyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_H, InputEvent.ALT_MASK);
    
            Action testAction = new AbstractAction() {
                public void actionPerformed(ActionEvent e) {
                     JOptionPane.showMessageDialog(frame, "Alt-H pressed");
                }
            };
    
            frame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(escapeKeyStroke, "TestAction");
            frame.getRootPane().getActionMap().put("TestAction", testAction);       
    
            JLabel label = new JLabel("Hit Alt-H");
            label.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
    
            frame.add(label);
            frame.setLocationByPlatform(true);
            frame.pack();
            frame.setVisible(true);
    
        }
    
        public static void main(String args[]) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();
                }
            });
        }
    }
    

    【讨论】:

      【解决方案3】:

      最好的方法是使用 setMnemonic(),因为它最简单。

      查看这篇文章了解更多http://www.herongyang.com/Swing/JMenuBar-Set-Keyboard-Mnemonics-on-Menu-Items.html

      private JMenu getColorMenu() {
        JMenu myMenu = new JMenu("Color");
        ButtonGroup myGroup = new ButtonGroup();
      
        JRadioButtonMenuItem myItem = new JRadioButtonMenuItem("Red");
        myItem.setSelected(true);
        myItem.setMnemonic(KeyEvent.VK_R);
        myItem.addActionListener(this);
        myItem.addMenuKeyListener(this);
        myGroup.add(myItem);
        myMenu.add(myItem);
      
        myItem = new JRadioButtonMenuItem("Green");
        myItem.setMnemonic(KeyEvent.VK_G);
        myItem.addActionListener(this);
        myItem.addMenuKeyListener(this);
        myGroup.add(myItem);
        myMenu.add(myItem);
      
        myItem = new JRadioButtonMenuItem("Blue");
        myItem.setMnemonic(KeyEvent.VK_B);
        myItem.addActionListener(this);
        myItem.addMenuKeyListener(this);
        myGroup.add(myItem);
        myMenu.add(myItem);
      
        return myMenu;
      

      【讨论】:

      • 这并没有解决问题,因为它表明无法使用像 alt 这样的键修饰符
      猜你喜欢
      • 1970-01-01
      • 2010-12-20
      • 1970-01-01
      • 2019-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-21
      • 2011-01-22
      相关资源
      最近更新 更多