【问题标题】:JOptionPane gives an errorJOptionPane 给出错误
【发布时间】:2012-08-29 21:32:52
【问题描述】:

我想使用JOptionPanes 处理一些异常。这是主要方法:

public class MainRun {

public static void main(String args[]){    
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                UIManager.setLookAndFeel(new SubstanceRavenGraphiteGlassLookAndFeel());
            }catch (Exception e){
                e.printStackTrace();
            }                 
            new MainGui().setVisible(true);                
            new Initialized().start();
            new PriorityMessageQueue().start();
        }
    });

MainGui 是应用程序的主窗口 (JFrame)。 我在PriorityMessageQueue 线程中处理了异常。

public class PriorityMessageQueue extends Thread {

@Override
public void run() {

    while (true) {
        try {
            instantMessages = instant.getMobitelMessagesToBeSent();
        } catch (Exception ex) {
                        JOptionPane.showMessageDialog(
                        null,
                        ex.getMessage(),
                        "Database Error",
                        JOptionPane.ERROR_MESSAGE);

        }

        ...

运行此程序后,出现错误

   org.jvnet.substance.api.UiThreadingViolationException: Component creation must be done on Event Dispatch Thread
at org.jvnet.substance.utils.SubstanceCoreUtilities.testComponentCreationThreadingViolation(SubstanceCoreUtilities.java:2312)
at org.jvnet.substance.SubstanceOptionPaneUI.createUI(SubstanceOptionPaneUI.java:83)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:37)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:244)
at javax.swing.UIDefaults.getUI(UIDefaults.java:752)
at javax.swing.UIManager.getUI(UIManager.java:989)
at javax.swing.JOptionPane.updateUI(JOptionPane.java:1859)
at javax.swing.JOptionPane.<init>(JOptionPane.java:1822)
at javax.swing.JOptionPane.<init>(JOptionPane.java:1785)
at javax.swing.JOptionPane.<init>(JOptionPane.java:1753)
at javax.swing.JOptionPane.<init>(JOptionPane.java:1731)
at javax.swing.JOptionPane.<init>(JOptionPane.java:1711)
at GUI.MainGui.showOptionPane(MainGui.java:1039)
at SMS.PriorityMessageQueue.run(PriorityMessageQueue.java:86)
    UIDefaults.getUI() failed: createUI() failed for
      javax.swing.JOptionPane
   [,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=,flags=0,maximumSize=,minimumSize=,p
   referredSize=,icon=,initialValue=,message=DatabaseConnection class
   connect,messageType=ERROR_MESSAGE,optionType=DEFAULT_OPTION,wantsInput=false]
   java.lang.reflect.InvocationTargetException
   java.lang.Error
at javax.swing.UIDefaults.getUIError(UIDefaults.java:712)
at javax.swing.MultiUIDefaults.getUIError(MultiUIDefaults.java:133)
at javax.swing.UIDefaults.getUI(UIDefaults.java:758)
at javax.swing.UIManager.getUI(UIManager.java:989)
at javax.swing.JOptionPane.updateUI(JOptionPane.java:1859)
at javax.swing.JOptionPane.<init>(JOptionPane.java:1822)
at javax.swing.JOptionPane.<init>(JOptionPane.java:1785)
at javax.swing.JOptionPane.<init>(JOptionPane.java:1753)
at javax.swing.JOptionPane.<init>(JOptionPane.java:1731)
at javax.swing.JOptionPane.<init>(JOptionPane.java:1711)
at GUI.MainGui.showOptionPane(MainGui.java:1039)
at SMS.PriorityMessageQueue.run(PriorityMessageQueue.java:86)

JOptionPane 将无法正常显示!

我怎样才能获得父组件(MainGuiJFrame),而不是将null 传递给JOptionPane

【问题讨论】:

    标签: java swing joptionpane event-dispatching substance


    【解决方案1】:

    JOptionPane 是一个迷你 Swing GUI,和所有 Swing GUI 一样,它必须在 Swing 事件线程上创建,而不是在后台线程上创建。这可以通过在Runnable 中创建您的JOptionPane 然后在事件线程上将Runnable 排队来完成:

    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        JOptionPane.showMessageDialog(....);
      }
    });
    

    例如,

    } catch (Exception ex) {
       final String exMessage = ex.getMessage();
    
       SwingUtilities.invokeLater(new Runnable() {
         public void run() {
           JOptionPane.showMessageDialog(
             null,
             exMessage,
             "Database Error",
             JOptionPane.ERROR_MESSAGE);
           );
         }
       });
      }
    }
    

    至于你的问题,

    我怎样才能获得父组件(MainGuiJFrame),而不是将null 传递给JOptionPane

    您需要参考主 GUI。如何获得这将取决于您的程序是如何组织的。

    【讨论】:

      【解决方案2】:
      • Substance 对 EDT 非常敏感,所有更新都必须在 EDT 上完成

      • 否则你只能看到来自Swing JComponents 的toolbar(来自Native OS

      • 或来自RepaintManager 的异常(我认为来自Trident 包)

      • JOptionPane 必须包裹在invokeLater() 中,然后您的JOptionPane 才能可见,

      • 我认为你的 exception 谈论另一个问题,隐藏在你的代码中的东西,也许没有使用 Substance L&amp;F 的东西,这是次要问题

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-20
        • 2012-09-25
        • 2013-03-21
        相关资源
        最近更新 更多