1

メインで呼び出している関数を介してスイングを介してユーザーから入力を取得するプログラムがあります。送信ボタンには、アクション実行メソッドが添付されています。入力ファイルを削除し、テキストを設定してユーザーに通知した後、画面を再描画しようとしています。カスタム関数を使用した try/catch の後まで、再描画は行われません。順番に実行されるのに、何が間違っているのかわかりませんか?以下は、送信ボタンに添付された私のアクションのプリフォームです。frame.dispose() または setVisibility(false) を実行すると、フレームが削除されることに注意してください。ありがとう!!

    button.addActionListener(new ActionListener (){

                public void actionPerformed(ActionEvent e) {
                    loc = FileLoc.getText();
                    name =  FileName.getText();

                    //inform user
                    area.setText("Attempting To Run Test....");
                    //backGroundPane contains the user input fields and button      
                    frame.remove(backGroundPane);
                    frame.repaint();

                    if(loc != null && name != null && 
                            !loc.equals("") && !name.equals(""))
                    {
                        try {
                            CallDrivers();
                        } catch (InterruptedException e1) {
                            System.out.println("Error Running Function");
                            //e1.printStackTrace();
                        }
                    }
                    else{
                        area.setText("There are Blank Fields");
                        System.out.println("test");
                    }
                }});
4

1 に答える 1

3

EDT (イベント ディスパッチ スレッド) をブロックしています。

イベント ディスパッチ スレッドは、すべての UI イベントを一度に 1 つずつ、ポストされた順序でディスパッチする責任があります。イベントには次のものがあります。

  • キー イベント (たとえば、ユーザーがキーを押した)
  • マウス イベント (ユーザーがマウスを動かしたなど)
  • 呼び出しイベント (SwingUtilities.invokeLater() などJComponent.repaint()を呼び出した)
  • Paint イベント (コンポーネントのペイント要求)
  • アクションイベント (発生した InputEvent によってトリガーされる論理イベント)

repaint を呼び出すと、キューにイベントがプッシュされますが、現在のイベント (actionPerformed の 1 つ) が完了していない限り、再描画は発生しません。これが、try/catch が完了した後にのみ再描画が行われる理由です。

詳細はこちら: http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html

于 2012-10-30T14:18:32.780 に答える