3

私はまだ空白の問題を抱えていますJOptionPaneSOおよびJavaDocsでの調査に基づくと、これは明らかにを使用しないことと関係がありEDTます。私の質問は、EDTとその方法がどのように正確に適用されるJOptionPaneかということです。たとえば、ターミナルエラー出力は、JOptionPane以下がで実行されていないことを明確に示していますEDT。特に欠けているものは何ですか、そしてそのようなものはどのようRunnableに適合しますか?

import javax.swing.*;
public class PaneDemo
{
public static void main(String[] args)
{
    final String[] TEXT ={
            //message
            "Hello, World!",
            //title
            "Greeting"};//end TEXT
    showMyPane(TEXT);
}//end main
public static void showMyPane(final String[] TEXT)
{
    JOptionPane.showMessageDialog(null, TEXT[0], TEXT[1], 
        JOptionPane.INFORMATION_MESSAGE);
    if(!SwingUtilities.isEventDispatchThread())
    {
        System.err.println("Err: GUI failed to use EDT.");
    }//end if(!SwingUtilities.isEventDispatchThread())
}//end showMyPane
}//end class PaneDemo

回答は、を追加することを提案しましinvokeLaterた。ただし、BlueJではそれがうまくレンダリングされないようです。

BlueJスクリーンショット

また、isEventDispatchThread()はまだターミナルでエラーを返しています。それは単に今それが間違った場所にあるからですか?

4

1 に答える 1

11

次のようJOptionPaneに、イベント ディスパッチ スレッドで作成できます。

ここに画像の説明を入力

  final String[] TEXT = {
        //message
        "Hello, World!",
        //title
        "Greeting"};//end TEXT

     ...

    /**
     * Create GUI and components on Event-Dispatch-Thread
     */
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
                JOptionPane.showMessageDialog(null, TEXT[0] 
                      + "\n is on EDT: " + SwingUtilities.isEventDispatchThread(), TEXT[1],
                        JOptionPane.INFORMATION_MESSAGE);
        }
    });

Lesson: Concurrency in Swingを見てください。これは、そのすべてについて理解するのに役立ちます

アップデート:

コメントに従って、次のように各呼び出しでメソッドを開始する必要がJOptionPaneありEDTますshowPane(...)

   public static void showMyPane(final String[] TEXT) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JOptionPane.showMessageDialog(null, TEXT[0] 
                      + "\n is on EDT: " + SwingUtilities.isEventDispatchThread(), TEXT[1],
                        JOptionPane.INFORMATION_MESSAGE);
            }
        });
    }//end showMyPane

    public static void main(String[] args) {
        final String[] TEXT = {
            //message
            "Hello, World!",
            //title
            "Greeting"};//end TEXT
        showMyPane(TEXT);
    }
于 2012-10-26T19:57:04.077 に答える