Java-Swing:使用 HTML 设置选定的文本颜色

Posted

技术标签:

【中文标题】Java-Swing:使用 HTML 设置选定的文本颜色【英文标题】:Java-Swing: Setting Selected Text Color with HTML 【发布时间】:2014-05-07 04:00:19 【问题描述】:

我在找出如何使用 html 设置 JList 的选定文本的颜色时遇到问题。

使用 Java Swing 和 HTML,我设法为 JList 中每个字符串的特定部分着色,我的示例如下所示:

这是理想的,因为我可以为每个条目设置任意数量的不同颜色!

However, when the text is selected, only the default Black text turns White! html 彩色文本保持其颜色而不是变白,这导致某些颜色的文本非常难以阅读:

如何设置选中时文本的颜色?

我尝试在 JList 上使用 JList 的 setSelectionForeground(Color.WHITE) 方法,但它不影响 html 彩色文本(尽管它确实影响了非 html 彩色文本)

我还阅读了 Oracle 的 HTML-in-Swing 教程(我第一次发现关于使用 HTML 着色的内容),但找不到解决方案。

这是我的简短示例的代码:

import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.UIManager;
import java.awt.Color;

public class JListSelectionColorTest extends JFrame 

    private String[] exampleText = "Some example text without any color changes",
        "Some more example text without color changes",
        "Even more plain text!", 
        "<html>Uncolored Text! <font color=orange>Now some example Text with color!</font> more Uncolored Text!</html>", 
        "<html>Uncolored Text! <font color=green>And some more example text with color! Text, Text, Text!</font> more Uncolored Text!</html>",
        "<html>Uncolored Text! <font color=red>A string with red color, Text Text Text!</font> more Uncolored Text!</html>",
        "<html>Uncolored Text! <font color=blue>And finally a string with blue color, Text Text Text!</font> more Uncolored Text!</html>",
        "<html>Uncolored Text! <font color=purple><selection color=white>Testing if some html can turn the selection color white!</selection></font> more Uncolored Text!</html>";

    public JListSelectionColorTest() 
        super("JList Selection Color Test");

        // Set the Look and Feel of the window to the Native System's Look and Feel
        // (When using the default Look and Feel the problem still persists!)
        try 
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
         catch (Exception e) 
            e.printStackTrace();
        

        // Create a JList of Strings containing the exampleText String array
        JList<String> exampleJList = new JList<String>(exampleText);

        // Set the JList's text selection color to white
        exampleJList.setSelectionForeground(Color.WHITE); // This doesn't seem to affect the html-colored text's selection foreground

        // Add the JList to the JFrame
        add(exampleJList);

        pack();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
    
    public static void main(String[] args) 
        new JListSelectionColorTest();
    

【问题讨论】:

【参考方案1】:

一种方法是使用 ListCellRenderer,它使用 replaceAll(...) 将 HTML 代码从您选择的字符串中剥离出来。天哪,我讨厌在 HTML 中使用正则表达式,如果您的字符串中包含非 HTML 尖括号 &lt;&gt;,这将不起作用。

import javax.swing.DefaultListCellRenderer;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.UIManager;

import java.awt.Color;
import java.awt.Component;

public class JListSelectionColorTest extends JFrame 

   private String[] exampleText = 
         "Some example text without any color changes",
         "Some more example text without color changes",
         "Even more plain text!",
         "<html>Uncolored Text! <font color=orange>Now some example Text with color!</font> more Uncolored Text!</html>",
         "<html>Uncolored Text! <font color=green>And some more example text with color! Text, Text, Text!</font> more Uncolored Text!</html>",
         "<html>Uncolored Text! <font color=red>A string with red color, Text Text Text!</font> more Uncolored Text!</html>",
         "<html>Uncolored Text! <font color=blue>And finally a string with blue color, Text Text Text!</font> more Uncolored Text!</html>",
         "<html>Uncolored Text! <font color=purple><selection color=white>Testing if some html can turn the selection color white!</selection></font> more Uncolored Text!</html>" ;

   public JListSelectionColorTest() 
      super("JList Selection Color Test");

      try 
         UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
       catch (Exception e) 
         e.printStackTrace();
      
      JList<String> exampleJList = new JList<String>(exampleText);

      exampleJList.setCellRenderer(new MyCellRenderer());
      exampleJList.setSelectionForeground(Color.WHITE); 
      add(exampleJList);

      pack();
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setLocationRelativeTo(null);
      setVisible(true);
   

   public static void main(String[] args) 
      new JListSelectionColorTest();
   

   private static class MyCellRenderer extends DefaultListCellRenderer 
      // create a non-greedy regex to capture anything between angle brackets.
      private String regex = "\\<.*?\\>";

      @Override
      public Component getListCellRendererComponent(JList<?> list,
            Object value, int index, boolean isSelected, boolean cellHasFocus) 
         if (value == null) 
            return super.getListCellRendererComponent(list, value, index,
                  isSelected, cellHasFocus);
         

         // only interested in selected Strings
         if (isSelected) 
            String valueStr = value.toString(); // get the String
            valueStr = valueStr.replaceAll(regex, "");  // extract the HTML
            value = valueStr;  // put back into value Object variable
         
         return super.getListCellRendererComponent(list, value, index,
               isSelected, cellHasFocus);
      
   

更好的解决方案:使用 JSoup 去除 HTML。 更好的是,创建一个包含 HTML 和非 HTML 字符串的类,让 List 包含此类的对象,并在渲染器中交换字符串。

【讨论】:

太棒了!谢谢,这很好用!记住要警惕非 HTML s! @user3369258: 可以肯定的是,在这种情况下肯定会失败。感谢您发布一个简短的可编译示例程序。不是时候开始回答问题了吗? ;) 你在这里可能有很多贡献。 哈哈谢谢,有问题我看看能不能回答,我就是觉得这里的人都比我合格多了:)

以上是关于Java-Swing:使用 HTML 设置选定的文本颜色的主要内容,如果未能解决你的问题,请参考以下文章

QTextEdit如何将当前选定的文本行保持在屏幕上的同一位置

即使有换行符捕获光标位置中的所有内容,也将特殊标签应用于所有选定文本中的文本区域

Java-Swing中实现富文本编辑器

如何使用 jdbc 和 java-swing 从特定列中检索完整的 xml(DataType as XMLTYPE)

java-swing编程,实现计算器——支持四则运算

java-swing 给文本区jtextarea怎么加个滚动条?