ClassCastException:javax.swing.plaf.FontUIResource 无法转换为 javax.swing.InputMap

Posted

技术标签:

【中文标题】ClassCastException:javax.swing.plaf.FontUIResource 无法转换为 javax.swing.InputMap【英文标题】:ClassCastException: javax.swing.plaf.FontUIResource cannot be cast to javax.swing.InputMap 【发布时间】:2012-09-18 18:16:42 【问题描述】:

在 java 中运行一个 swing 应用程序,我在我的程序中遇到了这个异常。值得注意的是,这并不是每次我运行程序时都会出现的。

完整的堆栈跟踪:

Exception in thread "main" java.lang.ExceptionInInitializerError
    at org.backend.utils.importing.Loading$1.run(Loading.java:54)
    at org.backend.utils.importing.Loading.loadEverything(Loading.java:61)
    at org.main.BishopCarrollSchoolTracker.main(BishopCarrollSchoolTracker.java:70)
Caused by: java.lang.ClassCastException: javax.swing.plaf.FontUIResource cannot be cast to javax.swing.InputMap
    at javax.swing.plaf.basic.BasicButtonListener.getInputMap(BasicButtonListener.java:102)
    at javax.swing.plaf.basic.BasicButtonListener.installKeyboardActions(BasicButtonListener.java:78)
    at javax.swing.plaf.basic.BasicButtonUI.installKeyboardActions(BasicButtonUI.java:121)
    at javax.swing.plaf.basic.BasicButtonUI.installUI(BasicButtonUI.java:73)
    at javax.swing.JComponent.setUI(JComponent.java:662)
    at javax.swing.AbstractButton.setUI(AbstractButton.java:1782)
    at javax.swing.plaf.synth.SynthArrowButton.updateUI(SynthArrowButton.java:34)
    at javax.swing.AbstractButton.init(AbstractButton.java:2149)
    at javax.swing.JButton.<init>(JButton.java:118)
    at javax.swing.JButton.<init>(JButton.java:73)
    at javax.swing.plaf.synth.SynthArrowButton.<init>(SynthArrowButton.java:23)
    at javax.swing.plaf.synth.SynthScrollBarUI$2.<init>(SynthScrollBarUI.java:325)
    at javax.swing.plaf.synth.SynthScrollBarUI.createIncreaseButton(SynthScrollBarUI.java:325)
    at javax.swing.plaf.basic.BasicScrollBarUI.installComponents(BasicScrollBarUI.java:225)
    at javax.swing.plaf.basic.BasicScrollBarUI.installUI(BasicScrollBarUI.java:147)
    at javax.swing.JComponent.setUI(JComponent.java:662)
    at javax.swing.JScrollBar.setUI(JScrollBar.java:190)
    at javax.swing.JScrollBar.updateUI(JScrollBar.java:210)
    at javax.swing.JScrollBar.<init>(JScrollBar.java:144)
    at javax.swing.JScrollBar.<init>(JScrollBar.java:159)
    at javax.swing.JScrollPane$ScrollBar.<init>(JScrollPane.java:698)
    at javax.swing.JScrollPane.createHorizontalScrollBar(JScrollPane.java:794)
    at javax.swing.JScrollPane.<init>(JScrollPane.java:282)
    at javax.swing.JScrollPane.<init>(JScrollPane.java:305)
    at org.gui.base.generic.panels.ListTablePanel.<init>(ListTablePanel.java:44)
    at org.gui.base.main.internal.WorkPanel.<init>(WorkPanel.java:28)
    at org.gui.base.main.internal.InternalPanel.<clinit>(InternalPanel.java:38)
    ... 3 more

导致异常的行(在我的源代码中):

public static final WorkPanel WORK = new WorkPanel();

super(new WorkTable(AllWork.getElements(), true, true, true, true, true, true, true),
            new WorkTable(AllWork.getElements(), true, true, true, true, true, true, true, true));

public ListTablePanel(RefreshableTable m, RefreshableTable t) 
    this.main = m;
    this.totals = t;

    setLayout(LayoutFactory.createLayout());

    JScrollPane pane = new JScrollPane(main);

    main.setAutoCreateRowSorter(false);

    totals.setFont(totals.getFont().deriveFont(Font.BOLD));
    totals.setEnabled(false);

    pane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

    add(pane, LayoutFactory.newFactory().setFill(GridBagConstraints.BOTH).
            setY(0).setWeightX(1).setWeightY(1));
    add(totals, LayoutFactory.newFactory().setFill(GridBagConstraints.BOTH).
            setY(1).setWeightX(1).setInsets(new Insets(0, 2, 0, 17)));

我源代码中的最后一段代码是JScrollPane的构造。

我不明白为什么会抛出这个异常。

【问题讨论】:

【参考方案1】:

每当我看到这个:

在 java 中运行一个 swing 应用程序,我在我的程序中遇到了这个异常。值得注意的是,我每次运行程序时都不会显示。

警钟在我脑海中响起,我想“我是否正确处理 Swing 线程”?因为 Swing 线程意外导致并不总是发生的奇怪错误并不少见。

那么,您是否通过首先在事件线程上启动和显示 Swing GUI 来正确处理 Swing 线程?即,

private static void createAndShowGui() 

  // create and display my GUI here



public static void main(String[] args) 
  SwingUtilities.invokeLater(new Runnable() 
     public void run() 
        createAndShowGui();
     
  );

顺便说一句,您没有使用 Nimbus 或其他外观吗?

【讨论】:

首先,是的,我在 EDT 中处理所有 GUI 更改和初始化。其次,我使用 Nimbus 的外观和感觉。这有关系吗? 只是想补充一下,我有同样的想法,不是每次都发生。只是想问一下这种事情是错误还是我做错了。 使用 ThreadCheckingRepaintManager 验证 EDT。 @joelg236 如果您在 EDT 中处理所有更改和初始化,为什么堆栈跟踪包含 JScrollPane.&lt;init&gt; 条目并且线程名称是 main。这意味着滚动窗格未在 EDT 上初始化【参考方案2】:

修复了错误。发现我在 EDT 同时做 GUI 的东西。构造函数用了太久才使用invokeLater(),开始使用invokeAndWait()

【讨论】:

你能详细说明一下在美国东部时间的同时吗?这似乎是一个矛盾。 哈哈,是的。好吧,在构造函数中调用的invokeLater 被危险地靠近另一个名为refresh 的方法调用。 refresh 方法改变了 GUI 中尚不存在的东西,最终把事情搞砸了。它只是有时(大部分时间)发生,因为有时 EDT 在刷新方法之前优先考虑构造函数(不是优先的,据说,但有时间去做),有时。希望这是有道理的。 伤心?我真的松了一口气,我想通了。第一年编程:) 好吧,我仍然怀疑在构造函数中调用invokeLater()invokeAndWait()所有 Swing GUI 对象应在EDT 上构建和操作。还要检查泄漏的this:一个监听器,它看到了一个不完整的实例。您可以点击左侧的empty check mark 接受@HFoE 的回答。

以上是关于ClassCastException:javax.swing.plaf.FontUIResource 无法转换为 javax.swing.InputMap的主要内容,如果未能解决你的问题,请参考以下文章

javax.xml.parsers.SAXParserFactory ClassCastException

java.lang.ClassCastException:javax.xml.bind.JAXBElement 无法转换为

.ClassCastException:org.apache.xerces.jaxp.DocumentBuilderFactoryImpl 不能转换为 javax.xml.parsers.Docume

java.lang.ClassCastException:org.apache.xerces.jaxp.DocumentBuilderFactoryImpl 不能转换为 javax.xml.parse

java.lang.ClassCastException:libcore.net.http.HttpURLConnectionImpl 无法转换为 javax.net.ssl.HttpsURLConn

java.lang.ClassCastException:com.sun.mail.handlers.multipart_mixed 无法转换为 javax.activation.DataConten