我正在制作一个KeyListener
课程,所以我可以控制我想要的任何JTextField
,但我不知道如何得到JTextField
我打电话给我,所以我可以按下逃避和清除JTextField
?这是我目前的代码
private class IntegerTxtListener implements KeyListener {
public void keyTyped(final KeyEvent e) {
if (e.getKeyChar() < KeyEvent.VK_0
|| e.getKeyChar() > KeyEvent.VK_9) {
e.consume();
}
if (e.getKeyChar() == KeyEvent.VK_ESCAPE) {
e.consume();
//My Problem is Here----------------------------
e.getSource()).setText("");
}
}
@Override
public void keyPressed(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
}
答案 0 :(得分:2)
对我来说,您试图创建一个只允许整数值的文本字段。首先,您不应该使用KeyListener
作为JTextField
。相反,您应该使用DocumentFilter
作为JTextField
的基础文档。 DocumentFilter
可以过滤掉任何不需要的输入。
以下是仅允许整数输入的JTextField
示例。
private JTextField createTextField() {
JTextField field = new JTextField();
((AbstractDocument) field.getDocument()).setDocumentFilter(new DocumentFilter() {
@Override
public void insertString(FilterBypass fb, int off, String str, AttributeSet attr)
throws BadLocationException {
fb.insertString(off, str.replaceAll("\\D++", ""), attr); // remove non-digits
}
@Override
public void replace(FilterBypass fb, int off, int len, String str, AttributeSet attr)
throws BadLocationException {
fb.replace(off, len, str.replaceAll("\\D++", ""), attr); // remove non-digits
}
});
return field;
}
此外,可能不相关,但您可能想要查看另一个监听器,处理文本输入是DocumentListener
,它将监听文本字段的基础文档中的更改。您可以在How to write DocumentListeners
答案 1 :(得分:1)
我不知道您想要实现的目标,但如果要控制用户输入,请考虑使用DocumentFilter
。
如果您仍想使用KeyListener
仅e.getSource()
JTextField
ClassCastException
,请确保instanceof
不要使用if(evt.getSource() instanceof JTextField){
JTextField textfield = (JTextField) e.getSource();
textfield.setText("..");
e.consume();
}
KeyAdapter
运算符如下例所示。
KeyListener
考虑扩展{{1}}而不是实施{{1}}。
答案 2 :(得分:0)
我认为这可行:
if (e.getKeyChar() == KeyEvent.VK_ESCAPE) {
e.consume();
//My Problem is Here----------------------------
((JTextField)e.getSource()).setText("");
}
只是投射对象的默认方式。
但如果e
不是JTextField
的实例,可能会发生一些错误。
因此,如果您确定您的监听器不会提供除JTextField对象之外的源,您可以这样做。否则你添加错误处理/预防。