2013-07-01 27 views
0

我有一个JTextArea调用taMessage它显示一个消息字符串。该字符串可以在运行时由用户编辑。
我有一个JLabel lblLength来显示字符的数量。我正在使用lblLength.setText(taMessage.getText().length()+"/ 160");来显示字符数。显示秋千gui中的字符数

我应该使用taMessage来处理哪些事件监听器,以便在我的文本区域继续输入文本时,lblLength会不断更新自身?

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

回答

0

A 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"); 
    } 
}); 
+0

这不是访问长度的最佳方式。没有必要引用文本区域。 – camickr

+0

风格文本窗格(如'JTextPane'和'JTextEditor')将返回大于实际显示内容的文本长度。引用'Document#getLength'来获得更精确的显示字符数 – MadProgrammer

+0

@MadProgrammer当我尝试实现类似的东西时,我被告知我不能改变内部类中的非最终变量(lblLength) 。我该如何解决这个问题? – Pureferret

4

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

官方文档有一个体面的tutorial on Document Listeners

您会想要附加文档侦听器,既然您对字符计数感兴趣,那么您只需要使用上面用于在所有三个Document Listener的回调方法中初始化标签的相同代码。

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) { 
    } 
} 
+0

+1,用于引用DocumentEvent中的Document来获取文本的长度。 – camickr