0

私はProgressMonitorJava Swingで学ぼうとしています。この簡単なテストコードを作成しました-

public class ProgressMonitorTest extends JFrame 
{
private JPanel contentPane;
private ProgressMonitor progressMonitor;
private JButton button;
private static ProgressMonitorTest frame;
private static boolean isFrameReady;

public JButton getButton()
{
    return button;
}

public ProgressMonitor getProgressMonitor()
{
    return progressMonitor;
}

/**
 * Launch the application.
 */
public static void main(String[] args) 
{
    EventQueue.invokeLater(new Runnable() 
    {
        public void run() 
        {
            try 
            {
                frame = new ProgressMonitorTest();
                frame.setVisible(true);
                isFrameReady = true;
            } 
            catch (Exception e) 
            {
                e.printStackTrace();
            }
        }
    });

    while(!isFrameReady)
    {
        //
    }

    frame.getButton().addActionListener(new ActionListener() 
    {   
        @Override
        public void actionPerformed(ActionEvent e) 
        {
            try
            {
                for(int i=0;i<=10;i++)
                {
                    final int percent = i;
                    SwingUtilities.invokeAndWait(new Runnable() 
                    {   
                        @Override
                        public void run()
                        {
                            frame.getProgressMonitor().setProgress(percent * 10);
                            frame.getProgressMonitor().setNote("Completed " + percent*10 + "%.");
                        }
                    });
                    try
                    {
                        Thread.sleep(1000);
                    }
                    catch(Exception ee)
                    {
                        //
                    }                           
                }
            }
            catch(Exception es)
            {
                //
            }
        }           
    });
}

/**
 * Create the frame.
 */
public ProgressMonitorTest() 
{
    isFrameReady = false;

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 300);
    setTitle("Progress Monitor");

    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    contentPane.setLayout(new BorderLayout(0, 0));

    progressMonitor = new ProgressMonitor(frame, "Update in progress...", "", 0, 10);
    button = new JButton("Click Here");
    contentPane.add(button);

    setContentPane(contentPane);
}

}

これに関するいくつかの質問 -

  1. isFrameReadyチェックを外すと、プログラムはNullPointerException、ボタンのアクション リスナーを割り当てた行に a と表示します。

  2. 上記のチェックを維持すると、ボタンをクリックしても何も起こりません。

  3. 上記のチェックを行ってからデバッグを行い、アクション リスナーの行に到達するまでしばらく待ちます。この場合、動作しますがinvokeAndWait、イベント処理スレッドから呼び出すことができないと言ってすぐに終了します。

このすべてに何が欠けていますか?誰かがこれを機能させる方法を説明できますか。

4

1 に答える 1

2

isFrameReady チェックを削除すると、プログラムは、ボタンのアクション リスナーを割り当てた行で NullPointerException を返します。

を使用すると、正常isFrameReadyに作成されたことを確認できますframe。あなたの中mainで、 call を使用してイベントディスパッチスレッド(EDT)に投稿されたリクエストEventQueue.invokeLater(new Runnable(){}):チェックを削除すると、メインスレッドで isFrameReady呼び出す予定でし たが、EDTでまだ作成されていないため、 aが発生します。frame.getButton()frameframe = new ProgressMonitorTest();NullPointerException

上記のチェックを維持すると、ボタンをクリックしても何も起こりません。

上記のチェックはボタンのクリックとは関係がないことを理解してください。Swing のシングル スレッド ルールに違反して GUI がフリーズしたため、ボタンは何も実行していません。次のコード フラグメントが示すように、メソッドのインクリメントforループをactionPerformed別のスレッド内に配置し、そこから実行します。うまく機能することがわかります。

 new Thread(){
    public void run()
    {
       for(int i=0; i<10; i++)
        {
           //whatever you were doing.
        }
    }
   }.start(); 

上記のチェックを行ってからデバッグを行い、アクション リスナーの行に到達するまでしばらく待ちます。この場合、動作しますが、イベント処理スレッドから invokeAndWait を呼び出すことができないと言ってすぐに終了します。

SwingUtitlies.invokeAndWait()現在のスレッドをブロックし、EDT が与えられたタスクの実行を完了するまで待機します。actionPerformed()関数はすでに EDT 内で実行されているため、現在のスレッド:EDT から呼び出すと、SwingUtitlies.invokeAndWait()許可されない現在のスレッド:EDT がブロックされます。この場合は使用しないでくださいinvokeAndWaitSwingUtilities.invokeLater()代わりに電話する必要があります。

ただし、Swing スレッド モデルを理解するまでは何も得られないと思います。javadoc といくつかのインターネット リソースを読んでください。Filthy Rich Clients という本を持っていて、その本で提供されている例を試してみてください。グラフィック効果について、他のどのリソースよりも詳しい知識が得られます。

于 2013-10-07T17:58:38.730 に答える