java - 如何禁用 JLabel 的自动 HTML 支持?

标签 java html security jlabel

如果以 开头,Swing JLabel 会自动将任何文本解释为 HTML 内容。如果此 HTML 的内容是具有无效 URL 的图像,这将导致整个 GUI 挂起,因为应该加载此图像的 ImageFetche 将被 NPE 退出。

要重现此问题,只需按如下方式创建一个 JLabel

new JLabel("<html><img src='http:\\\\invalid\\url'>")

我知道有一个客户端属性可以防止 JLabel 解释 HTML。但是 JLabel 是许多 Swing 组件(如 JTree、JTable 等)的默认渲染器实现,这使得几乎所有允许用户输入的 Swing 应用程序都存在这个问题。因此,我没有实现大量自定义渲染器,而是在寻找一种全局解决方案来禁用 HTML 解释。

最佳答案

有一种方法可以创建自己的外观。
我不确定它的性能如何,但它确实有效。假设您将扩展“经典 Windows”L&F。您至少需要 2 个类 一个是 Look&Feel 本身,我们称它为 WindowsClassicLookAndFeelExt。您只需要覆盖方法 initClassDefaults。

package testSwing;

import javax.swing.UIDefaults;
import com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel;

public class WindowsClassicLookAndFeelExt extends WindowsClassicLookAndFeel    {
    @Override protected void initClassDefaults(UIDefaults table){
        super.initClassDefaults(table);
        Object[] uiDefaults = { "LabelUI", WindowsLabelExtUI.class.getCanonicalName()};
        table.putDefaults(uiDefaults);
    }
}

您还需要一个 WindowsLabelExtUI 类来管理所有 JLabel 并设置属性:

package testSwing;
import javax.swing.JComponent;
import javax.swing.plaf.ComponentUI;
import com.sun.java.swing.plaf.windows.WindowsLabelUI;

public class WindowsLabelExtUI extends WindowsLabelUI{
    static WindowsLabelExtUI singleton = new WindowsLabelExtUI();

    public static ComponentUI createUI(JComponent c){
        c.putClientProperty("html.disable", Boolean.TRUE);    
        return singleton;
    }
}

最后是将主题设置为 WindowsClassicLookAndFeelExt 时的测试类

package testSwing;

import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.UIManager;


public class Main{
    public static void main(String[] args){
        try{                UIManager.setLookAndFeel(WindowsClassicLookAndFeelExt.class.getCanonicalName());
        }catch (Exception e){
            e.printStackTrace();
        }

        JFrame frame = new JFrame("JList Test");
        frame.setLayout(new FlowLayout());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        String[] selections = {"<html><img src='http:\\\\invalid\\url'>", "<html><H1>Hello</h1></html>", "orange", "dark blue"};

        JList list = new JList(selections);

        list.setSelectedIndex(1);
        System.out.println(list.getSelectedValue());

        JLabel jLabel = new JLabel("<html><h2>standard Label</h2></html>");
        frame.add(new JScrollPane(list));
        frame.add(jLabel);
        frame.pack();

        frame.setVisible(true);
    }
}

你会看到类似的东西

alt text

关于java - 如何禁用 JLabel 的自动 HTML 支持?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3584263/

相关文章:

java - Gant 100% Ant 兼容吗?

javascript - WordPress wp_enque_style 行为不同于 <link href=...>

javascript - 在 Chrome 中从 CSS 执行 JavaScript,类似于 Firefox 和 IE

java - Maven:如何重命名项目的war文件?

java - Kotlin 或 Java 中恒定时间复杂度 O(1) 的 Concat 链表

php - 在 WooCommerce 单一产品中显示产品属性列表的简码

html - 在 Bootstrap 导航中垂直居中 img

cocoa - 编写安全的 Cocoa 代码

ftp - 有没有办法在无法访问服务器的情况下找到孤立页面?

java - Hibernate 在 SQL 查询中显示问号