1

私のプログラムには、同時に jlist のモデルに要素を追加する 4 つのスレッドがあります。これにより、更新や再描画が多すぎるため、jlist が点滅したり、例外をスローしたり、クラッシュすることさえあります。

問題を解決するために少し遅らせようとしましたが、多くの貴重な時間を失っていました。

私に何ができる?

このコードは私の問題をシミュレートします:

new Thread(new Runnable() {
    @Override
    public void run() {
        for(int i=0; i<4; i++){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    for(int o=0; o<2000; o++){
                        model.addElement("add");
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException ex) {
                            Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
                }
            }).start();
        }
   }
}).start();
4

3 に答える 3

2

model.addElement("追加"); 次のようになります。

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        listModel.addElement("add");
    }
});

このようにして、要素がランダムなスレッドではなく、EDT の下に追加されるようにします。

于 2012-10-18T18:29:27.673 に答える
1

あまりにも多くの更新/再描画を回避するには、モデルの更新をバックグラウンド スレッドで実行し、以前に公開された手法を使用して EDT でスイング モデルに 1 回コピーする必要があります。DefaultListModel を使用するのではなく、カスタムで addAll() を破棄することをお勧めします。

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        listModel.addAll( backgroundModel ); // only one fireDataChanged() fired
    }
});
于 2012-10-18T21:33:10.150 に答える
1

GUI 操作は、イベント ディスパッチ スレッドでのみ実行する必要があります。多くのスレッドを作成した場合でも、それらに対して GUI 以外の作業を行い、actionCommand (または同様のもの) を起動して GUI の側面を操作します。

Java Docs でこの警告を何度も読むことができます: Swing components are not thread safe

于 2012-10-18T18:17:17.577 に答える