【发布时间】:2020-07-13 05:55:40
【问题描述】:
就像我在标题中描述的那样,如果按下键盘上的一个键,我需要点击一个 JButton。例如:
ActionListenerClass actionListener = new ActionListenerClass();
KeyListenerClass actionListener = new KeyListenerClass();
JButton aButton = new JButton("A");
aButton.setActionCommand("A");
aButton.addActionListener(actionListener);
aButton.addKeyListener(keyListener);
当从键盘按下“A”时,按钮 A 将执行 doClick() 并将操作命令发送到操作侦听器的私有类以进行事件处理。现在看了很多stackoverflow的解决方法,都是用key binding,就是在input map和action map之间进行绑定。问题是我绝对必须使用带有私有类而不是绑定的键侦听器。我现在唯一能猜到的是上面的 keyListener 必须以某种方式接收键盘输入并在 keyPressed 方法中绑定到它的按钮上执行 doClick,我已经尝试过,但它根本不起作用。
编辑:这是我的完整代码。
- CalculatorViewController.java
import java.awt.*;
import java.awt.event.*;
import java.util.regex.Pattern;
import javax.swing.*;
/**Create the app GUI
* @author Bach Le
* @version 1.0
* @see java.awt, java.awt.event, javax.swing
* @since 12.0.1
*/
public class CalculatorViewController extends JPanel {
private JButton backSpaceButton;
public CalculatorViewController() {
Controller controller = new Controller();
KeyController keyController = new KeyController();
setBorder(BorderFactory.createMatteBorder(5, 5, 5, 5,Color.black));//Adding the panel border
backSpaceButton = new JButton("\u21DA");
backSpaceButton.setPreferredSize(new Dimension(52,55));
backSpaceButton.setOpaque(false);//set transparency
backSpaceButton.setContentAreaFilled(false);
backSpaceButton.setBorderPainted(false);
backSpaceButton.setActionCommand("Backspace Button");//set the action command
backSpaceButton.addActionListener(controller);//add action listener
backSpaceButton.setToolTipText("Backspace (Alt+B)");//set tooltip text
backSpaceButton.setFont(font);//set the font
backSpaceButton.addKeyListener(keyController);
add(backSpaceButton) ;
}
private class Controller implements ActionListener{
public void actionPerformed(ActionEvent e) {
//event handling here
}
}
private class KeyController implements KeyListener{
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==65) {
backSpaceButton.doClick();
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
}
}
2.Calculator.java
public class Calculator {
public static void main(String[] args) {
CalculatorViewController pane = new CalculatorViewController();
JFrame frame = new JFrame("Calculator");
frame.setContentPane(pane);
frame.setSize(380, 520);
frame.setLocationByPlatform(true);
frame.setResizable(true);
frame.setVisible(true);
}
}
关注CalculatorViewController,我试图在按下A时点击backSpaceButton(当然它是实际的退格按钮,但我稍后会修复它),所以它会将其动作命令发送到注册到它的动作监听器,将在Controller内部类的方法中处理。我不确定实现这一目标的正确方法。
【问题讨论】:
-
没用是什么意思?
keyPressed事件没有被触发吗?你能向我们展示你所有的代码吗? -
@PiRocks 他们现在被添加
-
你真的需要这么多代码来说明问题吗?你有几个按钮,你想用一个关键的监听器来触发这些按钮?最好的解决方案是在 jframe 上使用输入图/动作图。这样你就不需要专注了,因为你有多个按钮。默认情况下,空间应该触发一个焦点按钮吗?
-
@matt 我把我所有的代码都粘贴在那里,这样人们就可以按照他们的意愿重复我的问题。如果您不需要它,那么第一个代码块就足够了。不,我不允许使用哈希映射进行绑定(这是一个分配规范)
-
“不,我不允许使用哈希映射进行绑定” 我没有说任何关于哈希映射的事情。第一个代码块是不够的,您应该创建一个最小的可重现示例。 stackoverflow.com/help/mcve