【问题标题】:How to trigger backspage key event when button click java当按钮单击java时如何触发退格键事件
【发布时间】:2014-09-21 14:12:43
【问题描述】:

如何在按钮单击时触发退格键按下事件。

private void doClick(char type)
{
   jTextField1.dispatchEvent(new KeyEvent(jTextField1, KeyEvent.KEY_PRESSED, System.currentTimeMillis(),KeyEvent.SHIFT_DOWN_MASK, KeyEvent.VK_7, type));
   jTextField1.dispatchEvent(new KeyEvent(jTextField1, KeyEvent.KEY_TYPED, System.currentTimeMillis(),KeyEvent.SHIFT_DOWN_MASK, KeyEvent.VK_UNDEFINED, type));
   jTextField1.dispatchEvent(new KeyEvent(jTextField1, KeyEvent.KEY_RELEASED, System.currentTimeMillis(),KeyEvent.SHIFT_DOWN_MASK, KeyEvent.VK_7, type));
}

我使用此方法在按钮单击时添加一个字符。是否有任何机制可以触发这样的退格按键事件。

【问题讨论】:

  • 这似乎是很多工作却收效甚微...为什么不直接获取文本并删除字符?
  • 我觉得很容易做到,因为它简化了算法的思路。
  • 好吧,那你有问题了,KEY_TYPEDKEY_RELEASED之后

标签: java swing jtextfield keyevent buttonclick


【解决方案1】:

好的,在我回答问题之前,因为我认为这种方法很脏,这里有两个类似的概念......

您可以使用Action API,它允许您定义独立的工作单元。在插入新值的特殊情况下,这些可能是抽象的,可以完成繁重的工作,但这演示了删除字符的用例......

public class BackspaceAction extends AbstractAction {

    private JTextField field;

    public BackspaceAction(JTextField field) {
        putValue(NAME, "Back-space");
        this.field = field;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        String text = field.getText();
        if (!text.isEmpty()) {
            int position = field.getCaretPosition();
            if (position > 0) {
                text = text.substring(0, position - 1) + text.substring(position);
                field.setText(text);
                field.setCaretPosition(Math.max(position - 1, 0));
            }
        }
    }

}

或者通过使用Document 本身...

public class BackspaceAction extends AbstractAction {

    private JTextField field;

    public BackspaceAction(JTextField field) {
        putValue(NAME, "Back-space");
        this.field = field;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        Document doc = field.getDocument();
        if (doc.getLength() > 0) {
            int position = field.getCaretPosition();
            if (position > 0) {
                try {
                    doc.remove(position - 1, 1);
                    field.setCaretPosition(Math.max(position - 1, 0));
                } catch (BadLocationException ex) {
                    ex.printStackTrace();
                }
            }
        }
    }

}

这将简单地使用类似...的东西进行实例化

JButton back = new JButton(new BackspaceAction(field));

如果您一心想要深入了解 API 的底层细节,那么可以使用......

char value = (char)8;
field.dispatchEvent(new KeyEvent(field, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), 0, KeyEvent.VK_BACK_SPACE, value));
field.dispatchEvent(new KeyEvent(field, KeyEvent.KEY_RELEASED, System.currentTimeMillis(), 0, KeyEvent.VK_BACK_SPACE, value));
field.dispatchEvent(new KeyEvent(field, KeyEvent.KEY_TYPED, System.currentTimeMillis(), 0, KeyEvent.VK_UNDEFINED, value));

可能会奏效。我说可能,因为这确实适用于 Windows 7,但我不保证它是否适用于任何其他平台或 Windows 版本

现在,对我而言,我可以查看其他两个 Actions 并了解他们正在尝试做什么,我查看了关键事件方法并开始挠头想知道为什么,但这只是我.. .

【讨论】:

    【解决方案2】:

    所有 Swing 组件都有默认的动作来执行这种类型的功能。您可能需要考虑使用默认的“退格操作”来执行此操作。

    如果是这样,请查看ActionMapAction 类是一个简单的包装类,它允许您通过为您创建 Action 来轻松地为组件使用默认 Action。例如代码是:

    JTextField textField = new JTextField();
    Action backSpace = new ActionMapAction("Backspace", textField, "delete-previous");
    backSpace.putValue(AbstractAction.MNEMONIC_KEY, KeyEvent.VK_B);
    JButton backSpaceButton = new JButton(backSpace);
    

    您可以将 Action 与 JButtons、JMenuItems 一起使用。利用可重用代码来利用 Swing 组件的现有操作。

    【讨论】:

      猜你喜欢
      • 2014-09-09
      • 1970-01-01
      • 1970-01-01
      • 2019-12-17
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多