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

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));
}


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

最佳答案

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

您可以使用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版本上运行。

现在,对我来说,我可以查看其他两个Action并查看它们正在尝试做什么,我查看关键事件的方法并开始摸索,想知道为什么,但这就是我...

07-24 09:49
查看更多