1

私のプログラムは、プログラムの開始時に特定のディレクトリからファイルを読み取り (各ファイルにはオブジェクトが含まれています)、各オブジェクトをベクターに追加します。次に、updateList() が呼び出され、これらのオブジェクトを 1 つずつループし、それらの名前 (String プロパティ) を DefaultListModel を使用して JList に追加します。

問題は、プログラムの起動時にリストが空に見えることはめったにないことです。リストモデルによって報告されたリスト内のエントリ数を取得するなど、多くのチェックを実行しましたが、すべてが正しいように見えます。

誰もこれを見たことがありますか?ここで重要な何かが欠けていますか?

ありがとう、以下の updateList():

private void updateList(){
    for (int i=0; i < calculators.size(); i++){
        listModel.addElement(calculators.get(i).getName()); 
    }
}
4

1 に答える 1

1

誰もこれを見たことがありますか?

通常、イベント ディスパッチ スレッドで Swing コンポーネントを更新していないため、ランダム エラーが発生します。詳細については、並行性に関するSwing チュートリアルのセクションを参照してください。

具体的には、GUI を開始するときに invokeLater() メソッドを使用します。Swing チュートリアルには、たくさんの例があります。チュートリアルで使用する基本構造は次のようになります。

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

public class SSCCE extends JPanel
{
    public SSCCE()
    {
        add( new JLabel("Label") );
    }

    private static void createAndShowUI()
    {
        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new SSCCE() );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}
于 2011-07-11T14:26:34.033 に答える