AddDocumentListener';在JavaSwing中创建两个标题(使用标题边框)时的变量范围

AddDocumentListener';在JavaSwing中创建两个标题(使用标题边框)时的变量范围,java,swing,character,jtextarea,documentlistener,Java,Swing,Character,Jtextarea,Documentlistener,您好,我正在尝试在JTextArea的底部显示一个字符串(“字符计数:”)和一个动态字符计数。 当我运行下面的代码时,会打开一个没有characterCountTitle的面板。只有当我开始键入时,characterCountTitle才会显示,并且数字是正确的动态数字 我的目标是在面板向用户打开时立即显示characterCountTitle(字符串+字符计数) private void initComponents() { this.notePanel.getNoteDocument

您好,我正在尝试在JTextArea的底部显示一个字符串(“字符计数:”)和一个动态字符计数。 当我运行下面的代码时,会打开一个没有characterCountTitle的面板。只有当我开始键入时,characterCountTitle才会显示,并且数字是正确的动态数字

我的目标是在面板向用户打开时立即显示characterCountTitle(字符串+字符计数)

private void initComponents() {
    this.notePanel.getNoteDocument().addDocumentListener(new DocumentListener() {

        TitledBorder characterCountTitle;
        Border emptyBorder;

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

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

        public void changedUpdate(DocumentEvent e) {
            displayEditInfo(e);
        }

        private void displayEditInfo(DocumentEvent e) {
            Document document = e.getDocument();

            emptyBorder = BorderFactory.createEmptyBorder();

            //displays a string of "Character Count: " and another string of dynamic character count 
            characterCountTitle = BorderFactory.createTitledBorder(emptyBorder, "Character Count: " +  document.getLength());
            characterCountTitle.setTitlePosition(TitledBorder.BOTTOM);
            panel.setBorder(characterCountTitle);
        }
    });

    this.panel.add(notePanel, BorderLayout.CENTER);
    this.panel.add(navigation.buildPanel(), BorderLayout.SOUTH);
}
由于这个问题,我试图创造两个标题;一个用于字符串(在addDocumentListener之外),一个用于字符计数(在displayEditInfo方法内部),但它会弄乱变量范围


我非常感谢你的意见

您只需在
DocumentListener
之外创建并添加边框,只需更改文档事件的标题文本即可:

private void initComponents() {


        Border emptyBorder = BorderFactory.createEmptyBorder();
        final TitledBorder characterCountTitle = BorderFactory.createTitledBorder(emptyBorder, "Character Count:");
        characterCountTitle.setTitlePosition(TitledBorder.BOTTOM);
        panel.setBorder(characterCountTitle);

        this.notePanel.getNoteDocument().addDocumentListener(new DocumentListener()                 {

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

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

        public void changedUpdate(DocumentEvent e) {
            displayEditInfo(e);
        }

        private void displayEditInfo(DocumentEvent e) {
            Document document = e.getDocument();


            //displays a string and dynamic character count
            characterCountTitle.setTitle("Character Count: " +  document.getLength());
            panel.repaint();

        }
    });

    this.panel.add(notePanel, BorderLayout.CENTER);
    this.panel.add(navigation.buildPanel(), BorderLayout.SOUTH);
}

您只需在
DocumentListener
之外创建并添加边框,然后更改文档事件的标题文本即可:

private void initComponents() {


        Border emptyBorder = BorderFactory.createEmptyBorder();
        final TitledBorder characterCountTitle = BorderFactory.createTitledBorder(emptyBorder, "Character Count:");
        characterCountTitle.setTitlePosition(TitledBorder.BOTTOM);
        panel.setBorder(characterCountTitle);

        this.notePanel.getNoteDocument().addDocumentListener(new DocumentListener()                 {

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

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

        public void changedUpdate(DocumentEvent e) {
            displayEditInfo(e);
        }

        private void displayEditInfo(DocumentEvent e) {
            Document document = e.getDocument();


            //displays a string and dynamic character count
            characterCountTitle.setTitle("Character Count: " +  document.getLength());
            panel.repaint();

        }
    });

    this.panel.add(notePanel, BorderLayout.CENTER);
    this.panel.add(navigation.buildPanel(), BorderLayout.SOUTH);
}

谢谢你的快速回复。我尝试了您提供的代码,面板一打开它就会显示“字符计数”。但是,没有动态字符计数;document.getLength()在键入之前和之后都显示。@在youngChoung中,动态部分以前工作过,因此您必须更改其他内容。我们无法说出代码执行的确切上下文。因此,这取决于您是否理解该建议并适当地全面实施。这个建议基本上是做你以前做过的事情,但是在面板创建后立即将边框添加到面板中。这样,您就不需要重新创建边框,只需更改边框的文本即可。如果您需要更多帮助,请发布一个适当的说明问题的帖子,我们无法准确猜出您更改了什么。注意,更改边框文本后,您可能还需要在面板上调用
repaint()
,以确保重新绘制边框。@camickr:感谢
重新绘制
,在读完这篇文章之后,我还打算添加这一部分:缺少的是重新绘制方法!!它现在工作得很好。谢谢你们两位!:)谢谢你的快速回复。我尝试了您提供的代码,面板一打开它就会显示“字符计数”。但是,没有动态字符计数;document.getLength()在键入之前和之后都显示。@在youngChoung中,动态部分以前工作过,因此您必须更改其他内容。我们无法说出代码执行的确切上下文。因此,这取决于您是否理解该建议并适当地全面实施。这个建议基本上是做你以前做过的事情,但是在面板创建后立即将边框添加到面板中。这样,您就不需要重新创建边框,只需更改边框的文本即可。如果您需要更多帮助,请发布一个适当的说明问题的帖子,我们无法准确猜出您更改了什么。注意,更改边框文本后,您可能还需要在面板上调用
repaint()
,以确保重新绘制边框。@camickr:感谢
重新绘制
,在读完这篇文章之后,我还打算添加这一部分:缺少的是重新绘制方法!!它现在工作得很好。谢谢你们两位!:)