【问题标题】:How to make changes in a swing jframe from a thread如何从线程中更改 Swing jframe
【发布时间】:2015-03-25 18:58:14
【问题描述】:

我正在使用 Java 中的 swing,在我的程序中我必须进行一些计算。这些计算需要很多时间,所以我决定为这些计算创建一个线程,并从线程中更改 gui。

问题是当线程完成计算时,在 jtabbedPane 的选项卡中添加信息但是当我尝试更改此选项卡的标题时,它使用方法 setTitleAt 并调用 updateUI() 并且程序抛出以下异常:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at javax.swing.plaf.synth.SynthTabbedPaneUI.getFontMetrics(Unknown Source)
at javax.swing.plaf.basic.BasicTabbedPaneUI$TabbedPaneLayout.calculateTabRects(Unknown Source)
at javax.swing.plaf.basic.BasicTabbedPaneUI$TabbedPaneLayout.calculateLayoutInfo(Unknown Source)
at javax.swing.plaf.synth.SynthTabbedPaneUI$2.calculateLayoutInfo(Unknown Source)
at javax.swing.plaf.basic.BasicTabbedPaneUI$TabbedPaneLayout.layoutContainer(Unknown Source)
at java.awt.Container.layout(Unknown Source)
at java.awt.Container.doLayout(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validate(Unknown Source)
at javax.swing.RepaintManager$2.run(Unknown Source)
at javax.swing.RepaintManager$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at javax.swing.RepaintManager.validateInvalidComponents(Unknown Source)
at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

是否有可能因为线程调用而出现此错误?

【问题讨论】:

  • 您的主要问题是您有一个 NPE、空指针异常,而不是您没有正确处理线程(尽管这也可能是一个问题)。您需要通过查看引发异常的行来调试它。
  • 你不应该打电话给updateUI(),除非你改变了外观和感觉。您需要显示相关代码并隔离错误。

标签: java multithreading swing user-interface nullpointerexception


【解决方案1】:

无论您遇到什么其他问题,您都不应该直接从 AWT 事件线程以外的东西更新 UI。如果您有一个需要修改 UI 的异步进程(如计算线程),则需要将该操作排队以供事件线程执行。使用SwingUtilites.invokeLater() 并将Runnable 传递给它,这将进行必要的UI 更改。我没有尝试过这种确切的场景,但我敢打赌,您可以在工作线程中创建面板并使用Runnable 将其附加到选项卡式窗格。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    相关资源
    最近更新 更多