抱歉,这可能是一个简单的问题,但是每次在 JTextArea 中按下空格键时,我如何调用一个方法?我曾尝试将 keylistener 附加到文本区域,但无法使其正常工作。谢谢。
问问题
22693 次
3 回答
6
于 2013-03-26T03:05:40.383 回答
4
JTextArea jt=new JTextArea();
jt.addKeyListener(new KeyListener(){
public void keyPressed(KeyEvent ke){
if(ae.getKeyCode()==KeyEvent.VK_SPACE){
//call your method
}
}
});
于 2013-03-26T06:31:27.963 回答
0
虽然@camickr 有一个我赞成的简单的好解决方案,但一个复杂但更彻底的选择是使用与Document
关联的JTextArea
, 并覆盖它的insertString()
方法。有时您已经这样做了,例如,为了防止将字母添加到数字字段中。与 KeyBinding 相比,它的优点是当用户复制并粘贴到 JTextArea时它也会捕获。因此,如果用户将“foo bar”复制并粘贴到该区域,KeyBinding 将无法捕捉到它(我很确定,我错了吗?)并且 Document 技术会。例如,非常示意性地:
@Override
public void insertString(int offset, String str, AttributeSet a) throws BadLocationException {
if (str.contains(" "))
callMySpecialSpaceMethod();
super.insertString(offset, str, a);
}
正如@camickr 所指出的,与其直接继承和覆盖 Document.insertString(),不如将其设置为 DocumentFilter。(更喜欢组合而不是继承。)不幸的是,它有点笨拙,但这里是基本代码:
((AbstractDocument)myTextArea.getDocument()).setDocumentFilter(new DocumentFilter() {
@Override
public void insertString(FilterBypass fb, int offset, String str, AttributeSet a) throws BadLocationException {
if (str.contains(" "))
callMySpecialSpaceMethod();
fb.insertString(offset, str, a);
}
});
这比 KeyBinding 要做的工作要多得多,因此,除非您真的需要如此彻底,或者您已经出于其他原因这样做,否则 KeyBinding 会更简单。这取决于您的要求-在您的情况下,我认为您不在乎他们是否复制和粘贴。
于 2013-03-26T15:11:29.387 回答