gpt4 book ai didi

java - JButton 按键 - 没有任何反应

转载 作者:行者123 更新时间:2023-12-02 01:59:55 24 4
gpt4 key购买 nike

我正在尝试使按右箭头键与按 JButton 执行相同的操作。我可以将右箭头键绑定(bind)到按钮本身 - 但这意味着我必须在右键起作用之前按下按钮。现在我试图看看绑定(bind)到实际的 JFrame 是否是我想要的,但是当我绑定(bind)到框架时我根本无法发生任何事情:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
onButtonPress();
}

private void formKeyPressed(java.awt.event.KeyEvent evt) {
if (evt.getKeyCode() == KeyEvent.VK_RIGHT){
onButtonPress();
}
}

private void onButtonPress() {
pressNum++;
jLabel1.setText("Button has been pressed " + pressNum + " times.");
}

enter image description here

最佳答案

根据一般经验,您应该避免 KeyListener。主要原因是,为了让 KeyListener 生成按键事件,它注册到的组件必须是可聚焦的并且具有键盘焦点。就您而言,这可能意味着向 UI 中的每个组件添加一个“可能”获得键盘焦点的 KeyListener,这在现实世界中并不实用。

相反,您应该使用 Key Bindings API ,它为您提供了定义触发相关操作所需的焦点级别的方法。

按键绑定(bind) API 和示例使用 Actions API ,它允许我定义一个可以应用于许多“可操作”控件的单个工作单元

该示例还使用了委托(delegate)/回调/监听器(即 CounterListener),它允许我将“副作用”与操作本身解耦。

这基本上意味着Action可以做它需要做的事情,但是“其他”感兴趣的各方可以在它发生变化时执行一些其他操作。您同样可以将 ActionListener 附加到 Action,但这只是实现起来更简单、更快

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;

public class Test {

public static void main(String[] args) {
new Test();
}

public Test() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class TestPane extends JPanel {

public TestPane() {
JLabel label = new JLabel("...");
MyAwesomeAction action = new MyAwesomeAction(new CounterListener() {
@Override
public void counterChanged(int count) {
label.setText("Button has been pressed " + count + " times");
}
});

setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;

JButton button = new JButton(action);
add(button, gbc);
add(label, gbc);

InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
ActionMap am = getActionMap();

im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "MakeItSo");
am.put("MakeItSo", action);
}

}

public interface CounterListener {

public void counterChanged(int count);
}

public class MyAwesomeAction extends AbstractAction {

private int count;
private CounterListener listener;

public MyAwesomeAction(CounterListener listener) {
putValue(NAME, "Make it so");
this.listener = listener;
}

@Override
public void actionPerformed(ActionEvent e) {
count++;
listener.counterChanged(count);
}

}

}

关于java - JButton 按键 - 没有任何反应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51756958/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com