2016-07-18 9 views
1

JDialogを作成しようとしています.JDialogは、閉じられるまで開いたままにして、ユーザーが閉じることを許可しません。JDialogが 'dispose'まで表示されないExecution

import java.awt.Dialog.ModalityType; 

import javax.swing.JDialog; 
import javax.swing.JOptionPane; 
import javax.swing.SwingUtilities; 

public class MessageClass { 

    private JDialog waitDialog; 

    public MessageClass(String string_,String title_) { 

     JOptionPane msg=new JOptionPane(string_, 
      JOptionPane.INFORMATION_MESSAGE, 
      JOptionPane.DEFAULT_OPTION,null,new Object[]{},null); 
     waitDialog=msg.createDialog(title_); 
    } 

    public void openWait() { 

     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       waitMessage(); 
      } 
     }); 
    } 

    private void waitMessage() { 
     waitDialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); 
     waitDialog.setLocationRelativeTo(GUI.getInstance().frame); 
     waitDialog.setModalityType(ModalityType.DOCUMENT_MODAL); 
     waitDialog.pack(); 
     waitDialog.setVisible(true); 
    } 

    public void closeWait() { 
     waitDialog.dispose(); 
    } 

} 

私が理解できないこのクラスには3つの問題があります。 1つは、disposeが呼び出されるまでペインが表示されないことです。 2つ目は、おそらく最初の問題(私は2回呼び出すことを試みたことはありません)に関連しているものを処理しないことです。 3つ目は、ペインにテキストが表示されず、空白であることです。

私はこのようなクラスを設定します。

MessageClass msg=new MessageClass("Information text","Title"); 
msg.openWait(); 
// a bunch of code 
msg.closeWait(); 

誰かが私が間違っているの何見つけることができますか? TIA。

答えて

0

openWait()とcloseWait()はどこで実行していますか?それらがEventDispatchThread上にある場合、closeWait()が実行を終了するまでそのスレッドをブロックするので、ダイアログは自分自身を描画する機会を得ることができません。

+0

返信いただきありがとうございます。相対的なJavaの初心者として、スレッドが実行されているときに私は不安定な状態に陥っているので、本当にわかりません。私は 'invokelater'は、そのターンが来るたびに物事を別々のプロセスとして実行できると考えました。私のメインは、メインGUI(JFrame)を呼び出すために 'invokelater'を使います。これはJDialogをインスタンス化するメニュー項目を持っています。このメニュー項目は、このクラスと同様の 'invokelater'を行います。そのJDialogにはネットワークの一部を行うコードセグメントがあり、時間がかかることがあります。このクラスをインスタンス化し、 'openWait()'を呼び出して、ユーザーに何が起こっているかを知らせ、ユーザーを待機させます。 –

+0

また、アプリケーションが終了してもこのクラスがアクティブのままであることを追加する必要があります。 –

関連する問題