在 Java Swing 中创建两个标题(使用 TitledBorder)时 AddDocumentListener 的变量范围

Posted

技术标签:

【中文标题】在 Java Swing 中创建两个标题(使用 TitledBorder)时 AddDocumentListener 的变量范围【英文标题】:AddDocumentListener's variable scope when creating two titles (using TitledBorder) in Java Swing 【发布时间】:2017-05-07 01:59:24 【问题描述】:

您好,我正在尝试在 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 方法内),但它弄乱了变量范围。

非常感谢您的意见!

【问题讨论】:

【参考方案1】:

您可以简单地在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() 在输入前后显示。 @In-youngChoung,动态部分以前工作过,所以你一定改变了其他东西。我们无法说出您的代码是如何执行的确切上下文。因此,您可以理解该建议并正确实施。该建议基本上是做你以前做的事情,但在面板创建后立即将边框添加到面板中。然后你永远不需要重新创建边框,只需更改边框的文本。如果您需要更多帮助,请发布正确的 minimal reproducible example 来演示问题,我们无法准确猜测您更改了什么.. 注意,您可能还需要在更改边框文本后在面板上调用repaint(),以确保重新绘制边框。 @camickr :感谢repaint,我也打算在阅读后添加这部分:***.com/questions/6566612/… 缺少重绘方法!!它现在工作得非常漂亮。谢谢你们俩! :)

以上是关于在 Java Swing 中创建两个标题(使用 TitledBorder)时 AddDocumentListener 的变量范围的主要内容,如果未能解决你的问题,请参考以下文章

Java Swing 如何在我的自定义 ColorChooserPanel 中创建颜色样本?

如何在 Java Swing 中创建右键单击上下文菜单?

如何在JTable Invisible for Swing Java中创建一个列

如何在Java Swing中创建响应式JList

如何在 Swing 中创建延迟

如何在 Swing 中创建延迟