gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 13:47:45 25 4
gpt4 key购买 nike

如果以 开头,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/

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