如果以< html>开头,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.你需要在leas 2课程
一个是Look& Feel本身,我们称之为WindowsClassicLookAndFeelExt.您只需要覆盖方法initClassDefaults.
我不确定它的表现如何,但它确实有效.让我们假设你将扩展“经典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:\\\\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); } }
你会看到类似的东西