如果以 开头,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);
}
}
你会看到类似的东西
关于java - 如何禁用 JLabel 的自动 HTML 支持?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3584263/