(Java) JList иногда отображает пустой список при запуске программы

Моя программа считывает файлы из заданного каталога при запуске программы (каждый из которых содержит объект) и добавляет каждый объект в вектор. Затем вызывается updateList(), который перебирает каждый из этих объектов один за другим, добавляя их имена (свойство String) в JList с DefaultListModel.

Проблема в том, что очень редко при запуске программы список оказывается пустым. Я выполнил множество проверок, таких как получение количества записей в списке, как сообщает модель списка, и все оказалось правильно.

Кто-нибудь видел это раньше? Я пропустил что-то важное здесь?

Спасибо, updateList() ниже:

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

person Gareth Brading    schedule 11.07.2011    source источник


Ответы (1)


Кто-нибудь видел это раньше?

Случайные ошибки обычно возникают из-за того, что вы не обновляете компоненты Swing в потоке отправки событий. Прочтите раздел руководства Swing по Параллелизм для получения дополнительной информации.

В частности, вы должны использовать метод 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();
            }
        });
    }
}
person camickr    schedule 11.07.2011