Pytanie odnośnie JAVA okienkowej. Jak wstawić znak, który będzie informował, że właśnie wykonuje się kod? Taki znak czekania.
Mozesz sobie jakiegoś gifa przygotowac, wyswietlic go przed wywolaniem tego duzego kodu i schowac po wykonaniu. Ewentualnie mozesz tez zmienic kursor na waiting
albo po prostu w jakiejs labelce wypisac "program sie wykonuje" - na podobnej zasadzie jak z gifem
Dzięki za podpowiedzi. Na razie zdecyduję się tylko na wyświetlanie w labelce np. "Czekaj". W jaki sposób wyświetlić ten napis przed wykonaniem kodu i schować po wykonaniu? Program, po kliknięciu w Button, zbiera dane wpisane w kilku polach i przetwarza je w pętli.
Jak to "jak wyswietlic napis przed wykonaniem kodu"?:P No trzeba zrobic to przed wykonaniem kodu, ktory cos duzo mieli, nie podam Ci konkretnego numeru lini, bo go nie znam;p
No to wstaw w zdarzeniu Buttona
na samym początku label1.setVisible(true);
a na samym końcu label1.setVisible(false);
A jeżeli z gór znasz liczbę "obrotów" pętli to przyjrzyj się wspomnianemu Progress Bar :)
Wg standardów Windowsowych powinieneś przynajmniej zmienić ikonkę:
http://www.javaspecialists.eu/archive/Issue065.html
http://www.catalysoft.com/articles/busycursor.html
Jeszcze odnośnie labela. Co robię źle, bo label się nie wyświetla?
W klasie
public jakasKlasa()
deklaruję:
lCzekanie = new JLabel("Czekaj...");
lCzekanie.setBounds(800,150,100,30);
a w
public void actionPerformed(ActionEvent e)
deklaruję:
lCzekanie.setVisible(true);
W jakasKlasa chyba powinno być jeszcze:
add(lCzekanie);
ale wtedy label wyświetla się cały czas, jeszcze przed kliknięciem Buttona.
W JakasKlasa Powinno być
add(lCzekanie);
lCzekanie.setVisible(false);
Wyświetlanie (i usuwanie) informacji typu "Czekaj" musi być w innym wątku niż czasochłonna operacja.
Po dłuższej przerwie wracam do tematu (przez jakiś czas nie mogłem się nim zająć).
Nie udaje mi się wywoływać drugiego wątku w zdarzeniu Buttona. Żeby jeszcze to sprawdzić napisałem sobie krótki kod:
public class WatekGlowny extends JFrame implements ActionListener
{
JTextArea notatnik;
JButton przycisk_TestujWatki, przycisk_WyczyscNotatnik;
public WatekGlowny()
{
setSize(700,400);
setTitle("Test Wątków");
setLayout(null);
notatnik = new JTextArea();
JScrollPane poleWynikow = new JScrollPane(notatnik);
poleWynikow.setBounds(50,200,900,500);
add(poleWynikow);
przycisk_TestujWatki = new JButton ("TESTUJ WĄTKI");
przycisk_TestujWatki.setBounds(200,100,150,50);
add(przycisk_TestujWatki);
przycisk_TestujWatki.addActionListener(this);
przycisk_WyczyscNotatnik = new JButton ("WYCZYŚĆ WYNIKI");
przycisk_WyczyscNotatnik.setBounds(400,100,150,50);
add(przycisk_WyczyscNotatnik);
przycisk_WyczyscNotatnik.addActionListener(this);
}
public static void main(String[] args) throws IOException
{
WatekGlowny aplikacja = new WatekGlowny();
aplikacja.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
aplikacja.setExtendedState(JFrame.MAXIMIZED_BOTH);
aplikacja.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e)
{
Object source = e.getSource();
if (source==przycisk_TestujWatki)
{
notatnik.append("\n Tworzę nowy wątek");
Watek2 w2 = new Watek2();
Thread drugiWatek = new Thread(w2);
notatnik.append("\n Uruchamiam nowy wątek");
drugiWatek.start();
}
else if (source==przycisk_WyczyscNotatnik)
{
notatnik.setText("");
}
}
}
i druga Klasa:
public class Watek2 extends WatekGlowny implements Runnable
{
@Override
public void run()
{
notatnik.append("Watek2 działa");
}
}
Dlaczego to nie działa?
Dzięki Rossik. Próbując bawić się w programowanie ciągle natrafiam na jakieś problemy.:) Z czym polecacie się zapoznać w sprawie wątków i GUI? Czy np. SwingWorker?
proponuje zapoznac sie ogolnie z jakimis kursami o watkach i swingu w javie. Dobrze opisane jest to w kursach pjwstk przedmiot programowanie obiektowe dzial swing i wspolbieznosc. Powinno Ci sie wyklarowac ja czytalem i cos w glowie zostalo.
Dlaczego klasa Watek2 dziedziczy po klasie WatekGlowny?
Zmień kod (przy okazji nauczysz się współpracy dwóch klas ;) ).
...
if (source==przycisk_TestujWatki)
{
notatnik.append("\n Tworzę nowy wątek");
Watek2 w2 = new Watek2(this);
Thread drugiWatek = new Thread(w2);
notatnik.append("\n Uruchamiam nowy wątek");
drugiWatek.start();
}
...
public class Watek2 implements Runnable
{
private WatekGlowny mainThread;
public Watek2(WatekGlowny mainThread)
{
this.mainThread = mainThread;
}
@Override
public void run()
{
mainThread.notatnik.append("\nWatek2 działa");
}
}
Dzięki bogdans.
To pokazuje mi, ile jeszcze muszę się uczyć. Wątpię, czy kiedykolwiek uda mi się sprawnie posługiwać JAVA.