使用键1-9的KeyStroke不适用于JTextComponent的键盘映射

时间:2016-06-15 16:03:01

标签: java swing keymapping jtextcomponent

由于某些未知原因,此代码无效。

JTextComponent component = new JTextArea();
Keymap keymap = component.getKeymap();
keymap.addActionForKeyStroke(KeyStroke.getKeyStroke(KeyEvent.VK_1, InputEvent.ALT_DOWN_MASK), myAction);

当我按Alt和1(不在小键盘上,字母上方的1)时,它永远不会触发myAction。这对任何修饰符都不起作用。

此处给出的解决方案https://stackoverflow.com/a/11974908/3838784不起作用,仍未触发操作。从键映射中删除所有具有ALT作为修饰符的击键似乎也没有帮助。

1 个答案:

答案 0 :(得分:1)

我尝试了一个示例,使用您的代码,它似乎工作正常。如果有什么不同于你的代码,你能告诉我吗?

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import javax.swing.*;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.text.JTextComponent;
import javax.swing.text.Keymap;

public class MyExample extends JFrame {

    MyExample() {
        initGUI();
    } // Constructor

    private void initGUI() {
        // Create the button
        JButton myButton = new JButton("Press ME !");

        // Create the label
        JLabel testLabel = new JLabel("TEST !!!");

        // Set up the window 
        JPanel pane = (JPanel) getContentPane();
        pane.setLayout(new BorderLayout());

        pane.add(myButton, BorderLayout.CENTER);
        pane.add(testLabel, BorderLayout.SOUTH);
        JTextComponent component = new JTextArea();
        pane.add(component, BorderLayout.SOUTH);
        Keymap keymap = component.getKeymap();

        keymap.addActionForKeyStroke(KeyStroke.getKeyStroke(KeyEvent.VK_1, InputEvent.ALT_DOWN_MASK), new MyAction());

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
        // setSize(600,300);  

    }

    public static void main(String[] args) {
        try {
            // Set System L&F
            for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (UnsupportedLookAndFeelException e) {
            // handle exception
        } catch (ClassNotFoundException e) {
            // handle exception
        } catch (InstantiationException e) {
            // handle exception
        } catch (IllegalAccessException e) {
            // handle exception
        }
        // new MyExample().setVisible(true);
        EventQueue.invokeLater(() -> {
            MyExample me = new MyExample();
            me.setVisible(true);
        });
    }

    class MyAction extends AbstractAction{

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

    }
}