2012-08-29 162 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,这是次要的问题