1

我有以下非常简单的代码,用于创建 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 运行的。有没有人见过这样的东西?这可能与在不同机器上运行的图形硬件之间的差异有关吗?

4

2 回答 2

2

在解决问题一段时间后,我已经弄清楚发生了什么。

它与样式表和 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>

但是,如果您使用“透明”而不是纯色,则会显示样式表中的底层颜色。恼人的!

于 2012-10-05T09:10:02.423 回答
1

JLabel 没有被覆盖的事实并不相关,因为所有的绘画都委托给了一个 ComponentUI 的实例,即外观。这将因环境而异。

于 2012-08-30T12:14:58.057 回答