如何在按钮单击java时触发BackPage键事件

如何在按钮单击java时触发BackPage键事件,java,swing,jtextfield,keyevent,buttonclick,Java,Swing,Jtextfield,Keyevent,Buttonclick,单击按钮时如何触发退格按键事件 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(jText

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

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

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

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

您可以使用,这将允许您为工作定义自包含的单元。在插入新值的特殊情况下,这些可能是抽象的,但这演示了删除字符的用例

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

}
或者通过使用
文档
本身

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));
可能有用。我说可能,因为这在Windows7上确实有效,但我不能保证它是否能在任何其他平台或Windows版本上工作


现在,对我来说,我可以看看另外两个
动作
看看他们想做什么,我看了看关键事件方法,开始挠头想知道为什么,但那只是我…

好的,在我回答问题之前,因为我相信这个方法是肮脏的,这里有两个相似的概念

您可以使用,这将允许您为工作定义自包含的单元。在插入新值的特殊情况下,这些可能是抽象的,但这演示了删除字符的用例

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

}
或者通过使用
文档
本身

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));
可能有用。我说可能,因为这在Windows7上确实有效,但我不能保证它是否能在任何其他平台或Windows版本上工作


现在,对我来说,我可以看看另外两个
动作
看看他们想做什么,我看了看关键事件方法,开始挠头想知道为什么,但那只是我…

好的,在我回答问题之前,因为我相信这个方法是肮脏的,这里有两个相似的概念

您可以使用,这将允许您为工作定义自包含的单元。在插入新值的特殊情况下,这些可能是抽象的,但这演示了删除字符的用例

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

}
或者通过使用
文档
本身

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));
可能有用。我说可能,因为这在Windows7上确实有效,但我不能保证它是否能在任何其他平台或Windows版本上工作


现在,对我来说,我可以看看另外两个
动作
看看他们想做什么,我看了看关键事件方法,开始挠头想知道为什么,但那只是我…

好的,在我回答问题之前,因为我相信这个方法是肮脏的,这里有两个相似的概念

您可以使用,这将允许您为工作定义自包含的单元。在插入新值的特殊情况下,这些可能是抽象的,但这演示了删除字符的用例

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

}
或者通过使用
文档
本身

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));
可能有用。我说可能,因为这在Windows7上确实有效,但我不能保证它是否能在任何其他平台或Windows版本上工作


现在,对我来说,我可以看看另外两个
动作
看看他们在做什么,我看看关键事件方法,开始挠头想知道为什么,但那只是我…

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

如果是这样,那么请检查该类是一个简单的包装器类,它将允许您通过为您创建操作来轻松使用组件的默认操作。例如,代码是:

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

您可以将该操作用于JButtons、JMenuItems。使用可重用代码来利用Swing组件的现有操作。

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

如果是这样,那么请检查该类是一个简单的包装器类,它将允许您通过为您创建操作来轻松使用组件的默认操作。例如,代码是:

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

您可以将该操作用于JButtons、JMenuItems。使用可重用代码来利用Swing组件的现有操作。

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

如果是这样,那么请检查该类是一个简单的包装器类,它将允许您通过为您创建操作来轻松使用组件的默认操作。例如,代码是:

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

您可以将该操作用于JButtons、JMenuItems。使用可重用代码来利用Swing组件的现有操作。

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

如果是这样,那么请检查该类是一个简单的包装器类,它将允许您通过为您创建操作来轻松使用组件的默认操作。例如,代码是:

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);
你可以用Act