2

を使用していくつかの例外を処理したいと思い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が正しく表示されません!

ここに画像の説明を入力してください

に渡す代わりにnullJOptionPaneparentComponent(MainGui JFrame)を取得するにはどうすればよいですか?

4

2 に答える 2

6

AJOptionPaneはミニSwingGUIであり、すべてのSwing GUIと同様に、バックグラウンドスレッドではなく、Swingイベントスレッドで作成する必要があります。これは、を作成し、イベントスレッドでキューに入れることで実行JOptionPaneできますRunnableRunnable

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

あなたの質問については、

に渡す代わりにnullJOptionPaneparentComponent(MainGui JFrame)を取得するにはどうすればよいですか?

メインGUIへの参照が必要になります。これをどのように取得するかは、プログラムがどのように編成されているかによって異なります。

于 2012-08-29T21:38:11.963 に答える
3
  • SubstanceEDTは非常に機密性が高いため、すべての更新はEDTで実行する必要があります

  • それ以外の場合は、 tsからのみtoolbar(から来たNative OS)を見ることができますSwing JComponen

  • またはからの例外RepaintManager(私はそれをTridentパッケージからだと思います)

  • JOptionPaneに包む必要があります、そうすればinvokeLater()あなたのJOptionPanecoudlが見えるようになります、

  • 私はあなたexceptionが別の問題について話していると思います、あなたのコードに隠された何か、多分使用されたものがないかもしれませんSubstance L&F、これは二次的な問題です

于 2012-08-29T22:33:06.407 に答える