0

JLabelを追加するJPanelがあります。次に、すべてのJLabelを削除して、新しいJLabelをいくつか追加します。

だから私は次のことをします:

        panel.removeAll();panel.repaint();

        panel.add(new JLabel("Add something new");

        panel.revalidate(); 

これは正常に機能します。この後、次のように新しいスレッドを開始すると、問題が発生します。

    panel.removeAll();panel.repaint();

    (1)panel.add(new JLabel("Add something new");

    panel.revalidate();

    //new thread to start - this thread creates new JLabels that should appear under (1)
    firstProducer.start();              

    try {

            firstProducer.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

その後、元のJLabelからの出力は引き続き表示されます。再検証プロセスは長時間実行されるタスクであるため、再検証が行われ、競合が発生している間にfirstProducerスレッドが開始されることを読みました。これに対処するための最良の方法は何ですか?

4

1 に答える 1

4

問題はfirstProducer.joinです。javadocに記載されているように

このスレッドが終了するのを待ちます。

そのため、もう一方が終了するまでイベントディスパッチスレッドをブロックしているThreadため、パネルを再描画したり再検証したりすることはできず、UIに変更が表示されません。

詳細については、Swing同時実行チュートリアルを参照してください

于 2012-12-09T17:00:54.833 に答える