好的,在我回答问题之前,因为我认为这种方法很脏,这里有两个类似的概念......
您可以使用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 并了解他们正在尝试做什么,我查看了关键事件方法并开始挠头想知道为什么,但这只是我.. .