Problem z prawidłowym wyswietlaniem forma - Thread.sleep()

0

Witam,
Podczas pracy programu chciałbym, aby wyświetlało się drugie okno informujące o tym, że wykonywana jest jakaś czasochłonna operacja (wiem, że do tego mogę użyć ProgressBar, ale na razie nie w tym problem). Co zrobić, aby okno z informacją, że program coś liczy, było wyświetlane w "prawidłowy" sposób, bo jak na razie jest przezroczyste, a dopiero po wykonaniu się danych obliczeń wyświetla się prawidłowo. Przypuszczam, że trzeba coś pokombinować z wątkami, ale na razie nie doszedłem jeszcze jak się do tego zabrać.

Poniższy przykładowy kod w pełni obrazuje mój problem:

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

class Abc
{
    public static void main(String args[])
    {
        new Okno1();
    }
}
class Okno1 extends JFrame implements ActionListener
{
    public Okno1()
    {
        setSize(200,200);
        setLayout(null);
         
        setTitle("Okno glowne");
        setDefaultCloseOperation(3);
        setVisible(true);
        
        JButton dodaj=new JButton("Dodaj");
        dodaj.setBounds(25,25,100,25);
        add(dodaj);
        dodaj.addActionListener(this); 
    }
    public void actionPerformed(ActionEvent akcja)
    {
        Okno2 start=new Okno2();
        start.utworz();
        
        int i=0;
        while(i<10)
        {
            start.czekaj();
            i++;
        }
        start.zamknij();
    }
}
class Okno2 extends JFrame
{
    public void utworz()
    {
        setSize(200,100);
        setLayout(null);
         
        setTitle("Czekaj...");
        setDefaultCloseOperation(1);
        setVisible(true);
        
        JLabel nazwa=new JLabel("Czekaj...");
        nazwa.setBounds(25,25,120,25);
        add(nazwa);
    }
    public void czekaj()
    {
        try
        {
            Thread.sleep(500);
        }
        catch(InterruptedException e)
        {
        }
    }
    public void zamknij()
    {
        dispose();
    }
}

..aaa i jeszcze jedno.
Jeśli poniższy listing wyrzuce z nasłuchu i dodam np. do maina to jest wszystko ok, dlaczego?

... 
        Okno2 start=new Okno2();
        start.utworz();      
        int i=0;
        while(i<10)
        {
            start.czekaj();
            i++;
        }
        start.zamknij();
...
0

może spróbuj setAlwaysOnTop wrzucić w Okno2?

0

Thx za pomoc, ale nie o to mi chodziło. Efekt ma wyglądać następująco:
*klikam przycisk dodaj w Okno1, przechodzę do pętli while,
*w tym czasie, gdy wykonywana jest pętla while ma być widoczne Okno2 z komunikatem "Czekaj..."
*po zakończeniu pętli Okno2 zostanie zamknięte.

Wydaje mi się, że kod odpowiedzialny za wyświetlenie Okno2 należy wrzucić w osobny wątek. Próbowałem z tym kombinować, ale działania wątków jeszcze nie za bardzo rozumiem.

0

Jakoś sobie poradziłem, rozwiązanie poniżej:

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

class Abc
{
    public static void main(String args[])
    {
        new Okno1();
    }
}

class Okno1 extends JFrame implements ActionListener
{
    public Okno1()
    {
        setSize(200,200);
        setLayout(null);
         
        setTitle("Okno glowne");
        setDefaultCloseOperation(3);
        setVisible(true);
        
        JButton dodaj=new JButton("Dodaj");
        dodaj.setBounds(25,25,100,25);
        add(dodaj);
        dodaj.addActionListener(this); 
    }
    public void actionPerformed(ActionEvent akcja)
    {
        new Thread() 
        {
          public void run() 
          {
            try 
            {
                int i=1;
                Okno2 start=new Okno2();
                start.utworz();
                
                while(i<=20)
                {
                    String c="Czekaj..."+i;
                    start.czekaj(c);
                    
                    i=i+1;
                }
                start.zamknij();
            }
            catch(Exception e) 
            {
            }
          }
        }.start();}
}
class Okno2 extends JFrame
{
    public void utworz()
    {
        setSize(200,100);
        setLayout(null);
         
        setTitle("Czekaj...");
        setDefaultCloseOperation(1);
        setVisible(true);
        
        JLabel nazwa=new JLabel("Czekaj...");
        nazwa.setBounds(25,25,120,25);
        add(nazwa);
    }
    public void czekaj(String c)
    {
       
        try
        {
            Thread.sleep(100);
            nazwa.setText(c);
        }
        catch(InterruptedException e)
        {
        }
        
    }
    public void zamknij()
    {
        dispose();
    }
}

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