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.<init>
条目并且线程名称是 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