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 尖括号 <
或 >
,这将不起作用。
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如何将当前选定的文本行保持在屏幕上的同一位置
即使有换行符捕获光标位置中的所有内容,也将特殊标签应用于所有选定文本中的文本区域