gpt4 book ai didi

java - 如何阻止空格键触发按钮上的点击效果?

转载 作者:行者123 更新时间:2023-12-01 20:20:53 26 4
gpt4 key购买 nike

我创建了一个 jframe,并添加了一个按钮,单击该按钮后,它会要求您按任意按钮,该按钮也显示在该按钮上。
(其显示应如下所示 ->“单击我”->“按任意按钮”->“空格键”)
我的问题一是,我不想通过按空格键从“单击我”转到“按任意按钮”。
我的问题二是,当我处于“按任意按钮”状态并按空格键时,释放时,它会返回到“按任意按钮”而不是停留在“空格键”。
这是我的代码。

    public class Test {

/**
* @param args the command line arguments
*/

static class starton implements ActionListener {
private JButton button;
private JFrame frame;

public starton(JButton button, JFrame frame) {
this.button = button;
this.frame = frame;
}

public void actionPerformed(ActionEvent e) {
button.setText("Press A Button");
button.setSize(button.getPreferredSize());
button.addKeyListener(
new KeyListener() {
@Override
public void keyPressed(KeyEvent e){
String text = null;

char a = e.getKeyChar();
text = ""+a+"";
if (a == ' '){
text = "Space Bar";
}

button.setText(""+text+"");
button.setSize(button.getPreferredSize());
button.removeKeyListener(this);
}

@Override
public void keyTyped(KeyEvent e) {
}

@Override
public void keyReleased(KeyEvent ke) {
}
});
}
}

public static void main(String[] args) throws IOException {

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
double width = screenSize.getWidth();
double height = screenSize.getHeight();
int frame1w = 600;
int frame1h = 400;

JFrame frame1 = new JFrame("Foo");
frame1.setSize(frame1w, frame1h);
frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JPanel contentPane = new JPanel();
contentPane.setBackground(Color.WHITE);
contentPane.setLayout(null);
frame1.setContentPane(contentPane);

JButton button1 = new JButton("Click Me");
button1.setSize(button1.getPreferredSize());
button1.addActionListener(new starton(button1, frame1));
// add more code here
contentPane.add(button1);
frame1.setVisible(true);
}

}

最佳答案

JButton 安装一系列按键绑定(bind)来控制用户输入

您可以使用以下内容检查这些内容......

JButton btn = new JButton("Test");
InputMap im = btn.getInputMap();
for (KeyStroke ik : im.allKeys()) {
System.out.println(ik + " = " + im.get(ik));
}

在我的系统上,它打印

pressed SPACE = pressed
released SPACE = released

这告诉我,空格键已绑定(bind)到操作键按下释放

为了禁用这些键,您需要提供自己的绑定(bind)...

Action blankAction = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
}
};

ActionMap am = btn.getActionMap();
am.put("pressed", blankAction);
am.put("released", blankAction);

这只是用一个不执行任何操作的空 Action 替换 pressedreleased 绑定(bind)。

现在,警告一句 - 键绑定(bind)在不同平台/外观和感觉上可能会有所不同;您还应该注意,用户通常对某些控件可以做什么和不能做什么有预先定义的期望,更改它们将影响他们对您的程序的 react

关于你的第二个问题,按钮仍然使用你最初注册的相同的ActionListener,所以每当你按空格时,它就会触发再次使用 ActionListener,并添加一个新的 KeyListener 这将使您的问题变得更加复杂

您要么想要为两个按钮使用单独的 ActionListener,要么想要在第一次触发按钮时从按钮中删除 ActionListener - 我会选择第二个,更容易理解代码

no, i mean, if i disable the "press" for spacebar, would i be able to press it when i am at "Press Any Button"?

最简单的解决方案是使用两个不同的按钮,一个带有 ActionListener,用于设置另一个按钮,另一个按钮附加有一个 KeyListener

如果由于某种原因您“真的”不想这样做,那么您需要在第一次触发时从按钮中删除 ActionListener

static class starton implements ActionListener {

//...

public void actionPerformed(ActionEvent e) {
button.setText("Press A Button");
button.setSize(button.getPreferredSize());
button.addKeyListener(...);
button.removeActionListener(this);
}
}

关于java - 如何阻止空格键触发按钮上的点击效果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44750318/

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