加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 资源网站 > 资源 > 正文

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

发布时间:2020-12-14 21:13:16 所属栏目:资源 来源:网络整理
导读:如果以 html开头,Swing JLabel会自动将任何文本解释为HTML内容.如果此HTML的内容是包含无效URL的图像,则会导致整个GUI挂起,因为应加载此图像的ImageFetche将由NPE退出. 要重现此问题,只需按如下方式创建JLabel new JLabel("htmlimg src='http:\invalidu
如果以< html>开头,Swing JLabel会自动将任何文本解释为HTML内容.如果此HTML的内容是包含无效URL的图像,则会导致整个GUI挂起,因为应加载此图像的ImageFetche将由NPE退出.

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

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

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

解决方法

如果你创造自己的外观和感觉,有一种方法.
我不确定它的表现如何,但它确实有效.让我们假设你将扩展“经典Windows”L& F.你需要在leas 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:\invalidurl'>","<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);
    }
}

你会看到类似的东西

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读