在解决问题一段时间后,我已经弄清楚发生了什么。
它与样式表和 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>
但是,如果您使用“透明”而不是纯色,则会显示样式表中的底层颜色。恼人的!