java+getactionmap_java – 使用InputMap / ActionMap的Swing问题

我希望我的JTextField不仅在按下ENTER时处理文本,

而且当按下SPACE时.您可以在下面的代码中看到我将通常与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

不是请求的“空”字符串,而是“”.前一个动作的SPACE

已经“泄露”到刷新的JTextField,这非常烦人.

我看了一下摆动码.我最好的猜测是从一些KeyEvent生成一个ActionEvent,而KeyEvent.isConsumed()具有不同的结果,这取决于KeyEvent是一个ENTER还是一个SPACE(吞下一个ENTER,但不是一个SPACE).

谁知道如何解决这个问题?或者知道一种不同的方法来实现我的目标?

解决方法:

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

Anyone knows how to fix this?

不要使用KeyListener.

将您的代码添加到EDT的末尾,以便在使用空格更新文档后执行:

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,swing

来源: https://codeday.me/bug/20190530/1186438.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值