1

CardLayoutコンポーネントを備えたJFrameがあります。CardLayoutを使用して、アプリケーション実行のさまざまな瞬間にさまざまなJPanelを切り替えています。ある時点で、SwingWorkerオブジェクトを使用していくつかのXMLファイルを生成しています。今回は、ウィンドウに別のJPanelを表示して、ユーザーに待機するように指示します。このJPanelでは、3つのラベルを切り替えたいと思います。

  • JLabel 1は次のようになります:「お待ちください。」
  • JLabel 2は次のようになります:「お待ちください。」
  • JLabel 3は次のようになります:「お待ちください...」

現在、コードは次のようになっています。

        ConvertersWorker.execute();
        CLayout.show(Cards, WAIT_PANEL);


        Timer t =new Timer(500, new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e) {
                WaitPanel.SwitchLabels();
            }               
        });
        t.start();

        while (!this.finishedConverting)
        {

        }
        //After this im am executing other methods based on the generated XML files

SwingWorkerコード:

SwingWorker<Boolean, Void> ConvertersWorker = new SwingWorker<Boolean, Void>() {
    public Boolean doInBackground() {
        Boolean result = RunConverters();
        return result;
    }
    public void done() {
        try {
            finishedConverting = get();
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        } catch (ExecutionException ex) {
            ex.printStackTrace();
        }
    }
 } ;

JFrameがブロックされているため、2番目のJPanelも表示されません。whileループのためにブロックされますが、別の方法で実装する方法がわかりません。また、SwingWorkerのdone()メソッドは実行されません。実行された場合、finishedConverting変数はtrueに設定され、whileループは停止します。誰かが私がより良い解決策を見つけるのを手伝ってくれる?

4

2 に答える 2

1

私はあなたがこれを解決したことを知っていますが、あなたが1つだけを使用しているために起こっていますthread、そしてそれはのためにブロックされました、それであなたはこれを処理Whileするために新しいものを作成する必要がありますthread

new Thread(){  
  public void run() { 
    //code here
  }
}.start();

JPanelとあなたが使用できるのコンテンツを更新するには

myJpanel.doLayout();

また

myJpanel.repaint();
于 2012-09-14T08:43:08.987 に答える
0

ループを削除し、whileループの後にあるコードを、のメソッドで実行される別のメソッドに移動しdone()SwingWorkerので、動作するようになりました。

于 2012-09-14T08:53:29.527 に答える