【问题标题】:Strange issue with JLabel HTML renderingJLabel HTML 渲染的奇怪问题
【发布时间】:2012-08-25 03:51:20
【问题描述】:

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

【问题讨论】:

  • label.setOpaque(true);label.setBackground(Color.RED); 将帮助您查看 JLabels 边界到 JPanel
  • 如需尽快获得更好的帮助,请发帖SSCCE
  • 我无法使用GridLayout/GridBagLayout 重现它,因此缺少 SSCCE,我对原因的最佳猜测是 a) 其余代码 b) MigLayout 或 c) JRE。
  • 感谢您尝试安德鲁。在最简单的情况下,它并没有比我发布的更多 - JFrame 包含 JPanel 包含 JLabel。在表格单元格中渲染 JLabel 和渲染 JButton 时也是如此。都很奇怪!
  • @RichardP 请接受答案?

标签: java html swing miglayout


【解决方案1】:

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

【讨论】:

    【解决方案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>
    

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

    【讨论】:

      猜你喜欢
      • 2014-02-15
      • 2014-02-20
      • 1970-01-01
      • 2021-08-16
      • 2011-07-30
      • 2023-01-02
      • 2012-08-25
      • 2016-04-22
      • 2021-05-27
      相关资源
      最近更新 更多