单击按钮时如何触发退格键按下事件。
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));
}
我使用此方法在按钮单击时添加一个字符。是否有任何机制可以触发这样的退格键按下事件。
答案 0 :(得分:3)
好的,在我回答这个问题之前,因为我认为方法很脏,这里有两个相似的概念......
您可以使用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
,看看他们想要做什么,我看一下关键事件的方法,然后开始挠头想知道为什么,但那只是我...
答案 1 :(得分:0)
所有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 with JButtons,JMenuItems。利用可重用代码来利用Swing组件的现有Actions。