JLabel HTML呈现的奇怪问题

时间:2012-08-30 12:08:19

标签: java html swing miglayout

我有以下非常简单的代码,用于创建JLabel并使用MigLayout布局管理器将其添加到面板:

MigLayout layout = new MigLayout();
JPanel panel = new JPanel(layout);
panel.setBackground(Color.GRAY);
JLabel label = new JLabel("<html><h3>Some Text</h3></html>");
panel.add(label, "growx,w 220!,h 40!,top");

这应该将标签渲染为透明,以便在标签后面显示面板背景 - 这是我们想要的行为。

然而,在某些PC上,标签会以坚固的白色背景呈现 - 即好像已经设置了opaque = true。

奇怪的是,如果标签文本是使用html格式化,这不是问题。

JLabel label = new JLabel("Some text");

我们使用BasicLabelUI作为UI委托,所以我希望在这里看到标准的绘画行为。

这是在Windows XP中使用jre 1.6.0_30运行的。以前有人见过这样的东西吗?它可能与各种机器上运行的图形硬件之间的差异有关吗?

2 个答案:

答案 0 :(得分:2)

我已经解决了从问题中抽出一些时间后发生的事情。

与Stylesheets和HTMLEditorKit有关。

假设以下示例css:

body  {
background-color: #ffff00}

以下代码简单地将其加载到新的HTMLEditorKit实例中,然后将非不透明的html标签添加到面板。

public class HTMLLabelTest extends JFrame {

public static void main(String[] args) throws Exception {
    SwingUtilities.invokeAndWait(new Runnable() {
        @Override
        public void run() {
            JFrame frame = new HTMLLabelTest();
            frame.pack();
            frame.setVisible(true);
        }
    });
}

public HTMLLabelTest() {

    addWindowListener(new WindowAdapter() {
        @Override
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    });

    HTMLEditorKit htmlEditorKit = new HTMLEditorKit();
    StyleSheet styleSheet = new StyleSheet();
    URL resource = getClass().getResource("/stylesheet.css");
    styleSheet.importStyleSheet(resource);
    htmlEditorKit.setStyleSheet(styleSheet);

    JLabel label = new JLabel();
    label.setText("<html><B>Some HTML Formatted</B> text</html>");
    label.setOpaque(false);
    label.setHorizontalAlignment(JLabel.CENTER);
    label.setHorizontalTextPosition(JLabel.CENTER);
    label.setPreferredSize(new Dimension(30,20));

    JPanel panel = new JPanel();
    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
    panel.add(label);

    panel.setOpaque(true);
    panel.setBackground(Color.WHITE);

    add(panel);
    setPreferredSize(new Dimension(300,200));
}

}

导入后,样式表可供HTMLEditorKit的后续实例使用,例如用于呈现标签的实例。因此,在代码示例中,非透明标签显示为黄色背景。

如果在示例中安装样式之前创建标签,则标签(和后续标签)将不会拾取样式并根据需要呈现为非透明。

我们遇到的问题是我们的应用程序可以单独启动,也可以从另一个应用程序(在同一个jre中运行)启动。第二个应用程序的某些用户可以在我们的应用程序启动之前访问安装样式表的屏幕。在这些实例中,样式被加载并存储为默认值,可供我们的应用程序使用。这就是为什么有些用户报告了问题而其他用户没有报告问题的原因。

我尚未决定最佳解决方案。一种可能性是在创建标签html时覆盖背景样式:

<html><body bgcolor=\"red\">Test</body></html>

但是,如果使用“透明”而不是纯色,则会显示样式表中的基础颜色。讨厌!

答案 1 :(得分:1)

JLabel未被覆盖的事实并不重要,因为所有绘画都被委托给ComponentUI的实例,即外观。这将因环境而异。