gpt4 book ai didi

java - InputMap/ActionMap 的 Swing 问题

转载 作者:搜寻专家 更新时间:2023-11-01 02:15:40 26 4
gpt4 key购买 nike

我希望我的 JTextField 不仅在按下 ENTER 时处理文本,而且当按下空格键时。您可以在下面的代码中看到,我将通常与 ENTER 关联的操作关联到 SPACE,但我得到了一些意外行为(见下文)。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.KeyStroke;

public class Test extends JFrame {

private JTextField textField;

public Test() {
textField = new JTextField();
add(textField);
InputMap inputMap = this.textField.getInputMap();
Object actionSubmit = inputMap.get(KeyStroke.getKeyStroke("ENTER"));
Object actionSubmitSp = inputMap.get(KeyStroke.getKeyStroke("SPACE"));
System.out.println("actionSubmit for space = " + actionSubmitSp);
ActionMap actionMap = this.textField.getActionMap();
Action action = actionMap.get(actionSubmit);
System.out.println("actionSubmit = " + actionSubmit);
textField.getInputMap().put(KeyStroke.getKeyStroke("SPACE"),
actionSubmit);

textField.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent evt) {
textField.setText(null);
System.out.println("event received:[" +
evt.getActionCommand() + "]");
}
});
}

public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {
Test test = new Test();
test.pack();
test.setVisible(true);
}
});
}
}

如果我键入“x SPACE”,则会生成一个 ActionEvent 并清除 JTextField。但是刷新的 JTextField不是请求的“空”字符串,而是“”。上一个 Action 的空间已“泄漏”到刷新的 JTextField,这很烦人。

我稍微查看了一下 swing 代码。我最好的猜测是 ActionEvent 是由某些 KeyEvent 生成的,并且 KeyEvent.isConsumed() 具有不同的结果,具体取决于 KeyEvent 是 ENTER 还是 SPACE(吞下 ENTER,但不是 SPACE)。

有人知道怎么解决吗?或者知道实现我的目标的不同方法?

最佳答案

正在生成多个事件。您的代码正在 keyPressed 事件上执行。但是,使用空格键也会导致生成 keyTyped 事件。这是在 keyPressed 代码执行后由文本组件处理的,因此 Document 被清除,然后添加一个空格。

Anyone knows how to fix this?

不要使用KeyListener

将您的代码添加到 EDT 的末尾,以便在 Document 更新为空格后执行:

textField.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(final ActionEvent evt)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
textField.setText(null);
System.out.println("event received:[" + evt.getActionCommand() + "]");
}
});
}
});

关于java - InputMap/ActionMap 的 Swing 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6916160/

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