我正在练习事件并想要设置它所以我有一个响应按钮和按键的类,它编译得很好,但关键事件不是调用方法/工作。
这是班级:
class CircleListener extends KeyAdapter implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == nlrg_button) canvas.enlarge();
else if (e.getSource() == shrink_button) canvas.shrink();
else if (e.getSource() == superenlarger_button) canvas.enlargeAlot();
else if (e.getSource() == supershrinker_button) canvas.shrinkAlot();
repaint();
}
@Override
public void keyPressed(KeyEvent e) {
switch(e.getKeyCode()){
case KeyEvent.VK_DOWN: canvas.circleDown(); break;
case KeyEvent.VK_UP: canvas.circleUp(); break;
case KeyEvent.VK_LEFT: canvas.circleLeft(); break;
case KeyEvent.VK_RIGHT: canvas.circleRight(); break;
}
repaint();
}
}
这是实例化+注册:
CircleListener listener = new CircleListener();
// Bind buttons with respective eventlistener class
nlrg_button.addActionListener(listener);
shrink_button.addActionListener(listener);
superenlarger_button.addActionListener(listener);
supershrinker_button.addActionListener(listener);
// Bind canvas to keylistener class
canvas.addKeyListener(listener);
他们试图调用的方法存在并按预期工作,我在确认之前通过按钮调用它们来保证。
为什么它不起作用/我错过了什么? &安培;是否有更有效的形式?
答案 0 :(得分:4)
为什么它不起作用/我缺少什么?
仅将KeyEvents分派给具有焦点的组件。由于面板上有许多组件,因此面板永远不会有焦点。你不应该为此使用KeyEvents。
我有一个响应按钮和按键的课程
这是一个很好的设计,但是你不应该为此使用KeyEvents。相反,您应该使用Key Bindings
。
使用Key Bindings时,您可以在按钮和KeyStroke之间共享Action。阅读How to Use Key Bindings上Swing教程中的部分,了解更多信息和示例。
使用Actions构建应用程序是一个很好的设计。本教程还有一个关于How to Use Action
的部分,您应该看一下。所有Swing组件都使用Actions和Key Bindings。您可以查看Key Bindings以获取Swing组件的默认绑定,以及使用键绑定的一些示例代码。