2012-08-29 167 views
2

我想用JOptionPane來處理一些異常。這是主要的方法:JOptionPane給出錯誤

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將無法​​正常顯示!

enter image description here

不是傳遞nullJOptionPane的,我怎麼能得到爲父級(MainGuiJFrame)?

回答

6

A 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); 
     ); 
    } 
    }); 
    } 
} 

至於你的問題,

相反通過nullJOptionPane,我怎麼能得到parentComponent(MainGuiJFrame)?

您將需要對主GUI的引用。你如何得到這將取決於你的程序是如何組織的。

+0

非常感謝! – Anjula

3
  • Substance是美國東部時間非常敏感,所有更新必須在美國東部時間

    完成
  • 否則你只能看到toolbarSwing JComponen TS

  • 或異常(來自Native OS)從RepaintManager(我認爲從Trident包)

  • JOptionPane必須包裝PED爲invokeLater(),那麼你的JOptionPane coudl可見,

  • 我想你exception談論另外一個問題,一些隱藏在你的代碼,也許還有是不是有使用Substance L&F,這是次要的問題