【问题标题】:Highlighting changing text in a java swing jtextcomponent在 java swing jtextcomponent 中突出显示更改的文本
【发布时间】:2025-12-21 09:10:06
【问题描述】:

我正在尝试像这样突出显示 JEditorPane 中的一些代码:

import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.text.DefaultHighlighter;
import javax.swing.text.Highlighter;

public class Driver
{
    public static void main(String[] args)
    {
        try
        {
            //create a simple frame with an editor pane
            JFrame frame = new JFrame("Highlight Test");
            JEditorPane pane = new JEditorPane();
            frame.getContentPane().add(pane);
            frame.setSize(300, 300);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);

            //string to put in the pane
            String text = "1234567890";

            //grab the highlighter for the pane
            Highlighter highlighter = pane.getHighlighter();

            //store all the text at once
            pane.setText(text);

            //go through all the characters
            for(int i = 0; i < text.length(); i++)
            {
                //highlight the latest character
                highlighter.addHighlight(i, i + 1, DefaultHighlighter.DefaultPainter);

                //sleep for a quarter second
                Thread.sleep(250);
            }
        }catch(Exception ex){}
    }

}

这将一次突出显示一个字符,并且所有字符都将保持突出显示。现在,我想要相同的行为(所有字符都保持突出显示),但我想更改突出显示之间的文本,如下所示:

import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.text.DefaultHighlighter;
import javax.swing.text.Highlighter;

public class Driver
{
    public static void main(String[] args)
    {
        try
        {
            //create a simple frame with an editor pane
            JFrame frame = new JFrame("Highlight Test");
            JEditorPane pane = new JEditorPane();
            frame.getContentPane().add(pane);
            frame.setSize(300, 300);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);

            //string to put in the pane
            String text = "1234567890";

            //grab the highlighter for the pane
            Highlighter highlighter = pane.getHighlighter();

            //go through all the characters
            for(int i = 0; i < text.length(); i++)
            {
                //place a new string in the pane
                pane.setText(pane.getText() + text.charAt(i));

                //highlight the latest character
                highlighter.addHighlight(i, i + 1, DefaultHighlighter.DefaultPainter);

                //sleep for a quarter second
                Thread.sleep(250);
            }
        }catch(Exception ex){}
    }

}

请注意窗格中的文本正在更改,然后我正在应用新的突出显示。旧的亮点消失了——我希望它们留下来。我的假设是每次 setText() 时高光都会消失。那么,有没有什么办法可以在改变文本的同时保持文本组件中的高亮呢?

【问题讨论】:

  • 欢迎接受您之前问题的一些答案。
  • @Reverend Gonzo :-) 你为什么要这个 :-) +1

标签: java swing highlighting jtextcomponent


【解决方案1】:

我没有尝试以下代码,但我建议只是尝试像这样突出显示最新字符和以前的字符:

        //go through all the characters
        for(int i = 0; i < text.length(); i++)
        {
            //place a new string in the pane
            pane.setText(pane.getText() + text.charAt(i));
          //highlight the previous characters
          if (i > 0) {
           for ( int j=i-1; j >= 0; j--)
             highlighter.addHighlight(j, j+1 , DefaultHighlighter.DefaultPainter);
           }
            //highlight the latest character
            highlighter.addHighlight(i, i + 1, DefaultHighlighter.DefaultPainter);

            //sleep for a quarter second
           // Thread.sleep(250);
        }
    }catch(Exception ex){}

【讨论】:

  • @othman 这是 Swing,在 Swing 中你永远不会使用 Thread.sleep(int),因为阻塞 EDT,意外输出到 GUI,请从你的示例中删除此代码行
  • 这一次突出显示两个字符,但我希望 all 应用旧的突出显示。 @mKorbel 另外, Thread.sleep 来自我的代码,仅用于我的测试代码。我不会在真正的应用程序中这样做。
  • @mKorbel :我没有尝试使用 Thread.sleep(int) 的代码部分,所以我只信任之前发布的代码。我认为他/她应该小心 Thread.sleep(int) 与 swing GUI 的交互。
  • @Mark M:我使用循环更新了代码以向后突出显示先前的字符。这是你需要做的吗?
  • @othman 在我的真实应用程序中,我实际上不会从头到尾突出显示所有旧字符。将有文本块突出显示和未突出显示的块。我只需要重新应用旧的亮点。
最近更新 更多