首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JOptionPane给出错误

JOptionPane给出错误
EN

Stack Overflow用户
提问于 2012-08-30 05:32:53
回答 2查看 3K关注 0票数 2

我想用JOptionPanes来处理一些异常。下面是main方法:

代码语言:javascript
复制
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线程内部的异常。

代码语言:javascript
复制
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);

        }

        ...

运行此命令后,我收到一个错误

代码语言:javascript
复制
   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将不能正常显示!

如何才能获得parentComponent (MainGui JFrame),而不是将null传递给JOptionPane

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-30 05:38:12

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

代码语言:javascript
复制
SwingUtilities.invokeLater(new Runnable() {
  public void run() {
    JOptionPane.showMessageDialog(....);
  }
});

例如,

代码语言:javascript
复制
} catch (Exception ex) {
   final String exMessage = ex.getMessage();

   SwingUtilities.invokeLater(new Runnable() {
     public void run() {
       JOptionPane.showMessageDialog(
         null,
         exMessage,
         "Database Error",
         JOptionPane.ERROR_MESSAGE);
       );
     }
   });
  }
}

关于你的问题,

如何才能获得parentComponent (MainGui JFrame)而不是将null传递给JOptionPane

您需要一个对主GUI的引用。你如何获得它将取决于你的程序是如何组织的。

票数 6
EN

Stack Overflow用户

发布于 2012-08-30 06:33:06

  • Substance非常敏感,所有更新都必须在EDT
  • 上完成,否则您只能看到来自RepaintManagerSwing JComponents
  • or异常的toolbar (来自Native OS) (我认为来自RepaintManagerTrident package)
  • JOptionPane必须包装到invokeLater()中,然后您的JOptionPane才可见,

< code >H118我认为您的exception谈到了另一个问题,您的代码中隐藏了一些东西,可能使用的Substance L&F没有什么问题,这是次要问题

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12186842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档