Java事件按键键盘

Java事件按键键盘,java,swing,events,key-bindings,Java,Swing,Events,Key Bindings,我有这门课。这个类绘制了3个按钮,我有一个与每个按钮关联的事件。我需要为键盘创建一个事件,按下一个键将与按下其中一个按钮相同。这是我的班级: public class ShapedDialog extends JDialog implements KeyListener, ActionListener { private final MainWindow parent; public ShapedDialog(MainWindow parent, String title) { su

我有这门课。这个类绘制了3个按钮,我有一个与每个按钮关联的事件。我需要为键盘创建一个事件,按下一个键将与按下其中一个按钮相同。这是我的班级:

public class ShapedDialog extends JDialog implements KeyListener, ActionListener {

private final MainWindow parent;

public ShapedDialog(MainWindow parent, String title) {
    super(parent, title, true);
    this.parent = parent;

    if (parent != null) {
        Dimension parentSize = parent.getSize();
        Point p = parent.getLocation();
        setLocation(p.x + parentSize.width / 4, p.y + parentSize.height / 4);
    }

    JPanel messagePane = new JPanel();
    messagePane.add(new JLabel());
    getContentPane().add(messagePane);

    JPanel buttonPane = new JPanel();

    //JButton1
    JButton jButton1 = new JButton();
    try {
        Image img = ImageIO.read(getClass().getResource("logo.png"));
        jButton1.setIcon(new ImageIcon(img));
    } catch (IOException ex) {
    }
    jButton1.addActionListener(new java.awt.event.ActionListener() {
        @Override
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton1ActionPerformed(evt);
        }
    });

    //JButton2
    JButton jButton2 = new JButton();
    try {
        Image img = ImageIO.read(getClass().getResource("logo.png"));
        jButton2.setIcon(new ImageIcon(img));
    } catch (IOException ex) {
    }
    jButton2.addActionListener(new java.awt.event.ActionListener() {
        @Override
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton2ActionPerformed(evt);
        }
    });

    //JButton3
    JButton jButton3 = new JButton();
    try {
        Image img = ImageIO.read(getClass().getResource("logo.png"));
        jButton3.setIcon(new ImageIcon(img));
    } catch (IOException ex) {
    }
    jButton3.addActionListener(new java.awt.event.ActionListener() {
        @Override
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton3ActionPerformed(evt);
        }
    });

    //Add buttons in the panel
    buttonPane.setLayout(new GridLayout(3, 3));
    buttonPane.add(jButton1);
    buttonPane.add(jButton2);
    buttonPane.add(jButton3);

    getContentPane().add(buttonPane, BorderLayout.SOUTH);
    setDefaultCloseOperation(DISPOSE_ON_CLOSE);

    pack();
    setVisible(true);
}

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here
    setVisible(false);
    parent.setMyPackage("Type 1");
    dispose();
}

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here
    setVisible(false);
    parent.setMyPackage("Type 2");
    dispose();
}

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here
    setVisible(false);
    parent.setMyPackage("Type 3");
    dispose();
}

@Override
public void actionPerformed(ActionEvent e) {
    setVisible(false);
    parent.setMyPackage("Type Package");
    dispose();
}

    public static void main(String[] a) {
        JTextField component = new JTextField();
        component.addKeyListener(new MyKeyListener());

        ShapedDialog dlg = new ShapedDialog((MainWindow) new JFrame(), "title");
    }

    @Override
    public void keyTyped(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void keyPressed(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void keyReleased(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

}

class MyKeyListener extends KeyAdapter {
    public void keyPressed(KeyEvent evt) {
        if (evt.getKeyChar() == 'a') {
            System.out.println("Check for key characters: " + evt.getKeyChar());
        }
        if (evt.getKeyCode() == KeyEvent.VK_HOME) {
            System.out.println("Check for key codes: " + evt.getKeyCode());
        }
    }
}
有人能帮我吗

我需要为键盘创建一个事件,按下一个键将与按下其中一个按钮相同

您需要:

  • 创建每个按钮要使用的
    操作
    。看
  • 使用
    操作创建JButton
  • 操作
    击键
    创建
    键绑定
    。看
  • 简单的例子:

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.border.*;
    
    public class CalculatorPanel extends JPanel
    {
        private JTextField display;
    
        public CalculatorPanel()
        {
            Action numberAction = new AbstractAction()
            {
                @Override
                public void actionPerformed(ActionEvent e)
                {
                    display.setCaretPosition( display.getDocument().getLength() );
                    display.replaceSelection(e.getActionCommand());
                }
            };
    
            setLayout( new BorderLayout() );
    
            display = new JTextField();
            display.setEditable( false );
            display.setHorizontalAlignment(JTextField.RIGHT);
            add(display, BorderLayout.NORTH);
    
            JPanel buttonPanel = new JPanel();
            buttonPanel.setLayout( new GridLayout(0, 5) );
            add(buttonPanel, BorderLayout.CENTER);
    
            for (int i = 0; i < 10; i++)
            {
                String text = String.valueOf(i);
                JButton button = new JButton( text );
                button.addActionListener( numberAction );
                button.setBorder( new LineBorder(Color.BLACK) );
                button.setPreferredSize( new Dimension(50, 50) );
                buttonPanel.add( button );
    
                KeyStroke pressed = KeyStroke.getKeyStroke(text);
                InputMap inputMap = button.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
                inputMap.put(pressed, text);
                button.getActionMap().put(text, numberAction);
            }
        }
    
        private static void createAndShowUI()
        {
    //      UIManager.put("Button.margin", new Insets(10, 10, 10, 10) );
    
            JFrame frame = new JFrame("Calculator Panel");
            frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
            frame.add( new CalculatorPanel() );
            frame.pack();
            frame.setLocationRelativeTo( null );
            frame.setVisible(true);
        }
    
        public static void main(String[] args)
        {
            EventQueue.invokeLater(new Runnable()
            {
                public void run()
                {
                    createAndShowUI();
                }
            });
        }
    }
    
    import java.awt.*;
    导入java.awt.event.*;
    导入javax.swing.*;
    导入javax.swing.border.*;
    公共类计算器面板扩展了JPanel
    {
    专用JTextField显示;
    公共计算器面板()
    {
    Action numberAction=new AbstractAction()
    {
    @凌驾
    已执行的公共无效操作(操作事件e)
    {
    display.setCaretPosition(display.getDocument().getLength());
    display.replaceSelection(例如getActionCommand());
    }
    };
    setLayout(新的BorderLayout());
    display=新的JTextField();
    display.setEditable(false);
    display.setHorizontalAlignment(JTextField.RIGHT);
    添加(显示,BorderLayout.NORTH);
    JPanel buttonPanel=新的JPanel();
    setLayout(新的GridLayout(0,5));
    添加(按钮面板、边框布局、中心);
    对于(int i=0;i<10;i++)
    {
    String text=String.valueOf(i);
    JButton按钮=新JButton(文本);
    addActionListener(numberAction);
    button.setOrder(新行边框(颜色为黑色));
    按钮。设置首选尺寸(新尺寸(50,50));
    按钮面板。添加(按钮);
    按下击键=击键。getKeyStroke(文本);
    InputMap InputMap=button.getInputMap(JComponent.WHEN_IN_FOCUSED_窗口);
    inputMap.put(按下,文本);
    button.getActionMap().put(文本、数字操作);
    }
    }
    私有静态void createAndShowUI()
    {
    //UIManager.put(“按钮边距”,新插图(10,10,10,10));
    JFrame=新的JFrame(“计算器面板”);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(新计算器面板());
    frame.pack();
    frame.setLocationRelativeTo(空);
    frame.setVisible(true);
    }
    公共静态void main(字符串[]args)
    {
    invokeLater(新的Runnable()
    {
    公开募捐
    {
    createAndShowUI();
    }
    });
    }
    }
    
    您得到的确切错误是什么?调用f.show()显示您的帧。我没有收到错误,只是没有捕捉到我按的键,没有显示System.out.println当我按任何键时,您发布的代码都可以正常工作。问题可能是您正在不同的控制台中查看?那么,我的问题是当我将所有代码放在一起时没有?是的。你有两个主要功能你的程序应该只有一个。