Zamiana obrazków w JLabel

0

Witam wszystkich.

Wpierw przedstawię kod, a następnie wytłumaczę, w czym leży problem.

Posiadam klasę, która jest rozszerzeniem JFrame'a. W jej konstruktorze znajduje się
taki fragment mający na celu wyświetlić obrazek :

try
        {
            repaint = ImageIO.read(new File(ReturnPageName(0)));
        }catch (IOException e) {
        }
        image = new ImageIcon(repaint);
        imageLabel = new JLabel();
        imageLabel.setIcon(image);
        imageLabel.setVisible(true);
        add(imageLabel);
        setUndecorated(true);
        setVisible(true);
        setSize(1024, 600);
 

W przypadku naciśnięcia określonego klawisza ma się wykonać poniższy fragment :

 
SetMenuImage(1);
                            try {
                                Thread.sleep(10000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
SetMenuImage(2);

Gdzie SetMenuImage to :

 
 public void SetMenuImage(int number)
{
try
        {
            repaint = ImageIO.read(new File(ReturnPageName(number)));
        }catch (IOException e) {
        }
        Graphics g = repaint.createGraphics();
// do dodawania obrazków oraz tekstu do tła
        g.setFont(font);
        g.setColor(black);

        image = new ImageIcon(repaint);
        imageLabel.setIcon(image);
        revalidate();
        repaint();
}

Problem polega na tym, że mimo iż program wchodzi do funkcji SetMenuImage(1) po naciśnięciu klawisza, to nowy obrazek się nie pokazuje. Po odczekaniu 10 sekund pokazuje się prawidłowo obrazek z SetMenuImage(2). Jeżeli oba te wywołania zamienię miejscami, to zawsze wykona się (pokaże) tylko i wyłącznie to drugie. Jaka może być przyczyna takiej
sytuacji ?

Z góry dziękuję za odpowiedź,

Pozdrawiam,
Sarachiel

1

Zamiast usypiać wątek utwórz timer, który po 10 sekundach wywoła SetMenuImage(2). Kod metody SetMenuImage jest kiepski, pomyśl co się wydarzy gdy nie powiedzie się odczyt pliku graficznego.

0

Dzięki za informację, poprawię kod, by dalej się wykonywał jedynie w sytuacji gdy ładowanie się powiedzie. Problem rozwiązałem wrzucając drugie wywołanie funkcji do SwingWorkera.

1 użytkowników online, w tym zalogowanych: 0, gości: 1