4

空にして再入力する必要があるJListコンポーネントがあります。次のコード(私の元のコードに基づく)は、JListとJButtonを備えた単純なウィンドウを示しています。

import java.awt.BorderLayout;
import javax.swing.*;

public class JListTest extends javax.swing.JFrame{
    JList jList;
    JButton button;
    DefaultListModel model;

    public JListTest() {
        jList = new JList();
        model = new DefaultListModel();
        jList.setModel( model );
        button = new JButton();

        getContentPane().add(jList, java.awt.BorderLayout.CENTER);

        button.setText("add 10000 items");
        button.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                model.clear();
                for( int i=0; i<10000; ++i ) {
                    model.addElement( "aaaa");
                }
            }
        });
        getContentPane().add(button, BorderLayout.PAGE_START);        
        pack();        
    }

    public static void main(String args[]) {
        JListTest jlt =new JListTest();
        jlt.setSize(300, 300);
        jlt.setVisible( true );
    }
}

ボタンを押すと挿入(10000アイテム)がとても速いです。何度も押すとまだとても速いです。

3番目の項目を選択してボタンを押すと、結果は同じで、挿入は非常に高速です。

最初の項目を選択してボタンを押すと、プログラムが非常に遅くなります(実際には停止する必要があります)。

最初の項目を選択すると実行が遅くなるのはなぜですか?

JDK1.5および1.6を使用してテストしました。

4

3 に答える 3

2

アイテムを選択するとパフォーマンスの問題が発生する理由がわかりません。ただし、アイテムを追加するたびに、リストにそのファイルを再描画するように指示するイベントが発生します。したがって、アイテムが選択されているという事実により、余分な再描画が発生する可能性があります。

とにかく、これを行うためのより良い方法は、新しいモデルを作成し、それをリストに追加することです。

    button.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            DefaultListModel dlm = new DefaultListModel();
            for( int i=0; i<10000; ++i ) {
                dlm.addElement( "aaaa");
            }
            jList.setModel(dlm);
        }
    });

このように、すべての新しいアイテムが追加されるときにイベントが発生することはありません。

于 2010-08-26T15:27:39.627 に答える
2

一度にたくさんの値を追加できる独自のモデルを作成することをお勧めします。モデルへの追加ではなく、これによってトリガーされたGUIがパフォーマンスを低下させるのではないかと思います。

于 2010-08-26T14:53:42.297 に答える
1

このようなイベントループでは、モデルに多くの要素を追加しないでください。アクションリスナーにスレッドを生成させてアイテムを追加し、そのスレッドでSwingUtilities.invokeLater()を呼び出して、リストへの変更イベントを発生させる方がはるかに優れています。

以下のコメントに従って、AbstractListModel(またはそのサブクラス)を作成してモデルにfireContentsChangedし、invokeLaterで呼び出す必要があることに注意してください。

于 2010-08-26T14:48:07.443 に答える