0

我有一个显示消息字符串的JTextArea调用。taMessage用户可以在运行时编辑此字符串。
我有一个JLabel lblLength显示字符数。我lblLength.setText(taMessage.getText().length()+"/ 160");用来显示字符数。

我应该为 taMessage 使用什么事件侦听器,以便在我不断在文本区域中输入文本时,lblLength 会不断更新自身?

就像我们在 way2sms 或 160by2 这样的网站上看到的那样,它会显示剩余的字符数。

4

3 回答 3

4

Swing 文本字段和文本区域由一个名为的类支持,该类Document可以附加一个 Document Listener。

官方文档有一个关于 Document Listeners 的不错的教程

您可能想要附加文档侦听器,并且由于您对字符计数感兴趣,因此您只需使用上面使用的相同代码来初始化所有三个文档侦听器回调方法中的标签。

于 2013-07-01T14:35:07.470 回答
3

在类似 MVC 的方式中,您可以收听文档的更改。

JTextArea ta = ...;
JLabel lblLength = ...;
Document taDoc = ta.getDocument();
taDoc.addDocumentListener(new CharacterCounterDocumentListener(lblLength))


public class CharacterCounterDocumentListener implements DocumentListener {

     private JLabel counterLabel;        

     public CharacterCounterDocumentListener(JLabel counterLabel){
         this.counterLabel = counterLabel;
     }

     public void changedUpdate(DocumentEvent e) {
        Document d = e.getDocument();
        int length = d.getLength();
        counterLabel.setText(Integer.toString(length));
     }
     public void insertUpdate(DocumentEvent e)  {
     }
     public void removeUpdate(DocumentEvent e) {
     }
}
于 2013-07-01T14:38:26.203 回答
0

DocumentListener可能是您最好的选择。你甚至不需要创建一个新类,你可以内联定义它。

// Listen for changes in the text
taMessage.getDocument().addDocumentListener(new DocumentListener() {
    public void changedUpdate(DocumentEvent e) {
        update();
    }

    public void removeUpdate(DocumentEvent e) {
        update();
    }

    public void insertUpdate(DocumentEvent e) {
        update();
    }

    public void update() {
        lblLength.setText(taMessage.getText().length()+"/ 160");
    }
});
于 2013-07-01T14:40:42.130 回答