在java swing中自定义详细的html链接颜色

Sha*_*jun 5 java swing

Swing允许在组件中使用html JLabel.文件详细讨论了这一点.它还显示了如何更改特定文本的颜色.

我正在使用包含数千个此类组件的现有swing应用程序.我想改变使用它的链接的颜色.一次做一个将是非常乏味的.默认情况下,如果未指定颜色,则swing似乎将其呈现为蓝色.

如何将此默认值更改为其他内容?

Mad*_*mer 6

所以,经过深入挖掘代码,我学到了......

  1. HTML由HTMLEditorKit关联的API 呈现
  2. 使用的默认样式表HTMLEditorKit是在AppContext中集中/全局维护的...

HTMLEditorKit#getStyleSheet

 AppContext appContext = AppContext.getAppContext();
 StyleSheet defaultStyles = (StyleSheet) appContext.get(DEFAULT_STYLES_KEY);    
Run Code Online (Sandbox Code Playgroud)

这有点重要,因为它意味着,您不会花费大量时间来尝试查看标签的外观和感觉代码而且您应该能够在一个地方更改全局样式表并影响所有内容的获取方式渲染......这可能是一件坏事......

接下来的问题是,你实际上无法访问StyleSheet内部,AppContext因为它DEFAULT_STYLES_KEYprivate static final Object...

这意味着您必须创建一个实例HTMLEditorKit并使用它getStyleSheet来获取它的引用...

链接

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.StyleSheet;
import sun.awt.AppContext;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                HTMLEditorKit kit = new HTMLEditorKit();
                StyleSheet styleSheet = kit.getStyleSheet();
                styleSheet.addRule("a {color:#ff0000;}");

                JLabel label = new JLabel("<html><a href=http://stackoverflow.com/questions/tagged/java>Stackoverflow</a></html>");

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(label);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}
Run Code Online (Sandbox Code Playgroud)