gpt4 book ai didi

java - JLabel HTML 呈现的奇怪问题

转载 作者:行者123 更新时间:2023-11-29 05:55:45 24 4
gpt4 key购买 nike

我有以下非常简单的代码,用于创建 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 委托(delegate),所以我希望在这里看到标准的绘画行为。

这是在 Windows XP 中使用 jre 1.6.0_30 运行的。有没有人见过这样的事情?会不会与不同机器上运行的图形硬件之间的差异有关?

最佳答案

在花一些时间解决这个问题后,我弄清楚了发生了什么。

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

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

关于java - JLabel HTML 呈现的奇怪问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12196524/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com