Od jakiegoś czasu piszę pewien program (Frameworka) do testowania algorytmów wyszukiwania wzorca w tekście. Chciałem w nim umieścić etykietę JLabel informującą na bieżąco o postępie wykonywanych testów.
Najpierw, próbowałem to zrobić bez dodatkowych wątków, z użyciem repaint(). To nie działało więc stworzyłem taką klasę implementującą interfejs Runnable:
class ProgressStatusThread implements Runnable
{
private JLabel status;
private JPanel jpnl;
Thread thrd;
ProgressStatusThread (String name, JPanel pnl)
{
thrd = new Thread(this, name);
jpnl = pnl;
status = new JLabel("Postęp: ");
status.setBounds(670, 220, 70, 25);
jpnl.add(status);
}
public void setStatus(String str)
{
status.setText(str);
}
public void run ()
{
try {
status.repaint();
Thread.sleep(250);
}
catch (InterruptedException exc)
{
}
}
}
Następnie wątek jest tworzony i jego działanie testowane w jednej z metod, wywoływaną przez inną z metod...itd. koniec końców działającej w metodzie main. Fragment kodu:
int partlyTest (String txt, String pat, MyTimer myTimer, String name)
{
int i, amount = 200;
long start, stop;
myTimer.timer = (long)0;
long time = 0;
ProgressStatusThread psT = new ProgressStatusThread("progress status", jpnlDetailedTests);
Thread thrd1 = new Thread(psT);
thrd1.start();
if(name.equals("n")) //Naiwny
{
for (i=0; i<100; i++)
{
psT.setStatus("Postęp: " + i); //
start = System.currentTimeMillis();
for(int j=0; j<amount; j++)
searchObj.nSearch(txt, pat);
stop = System.currentTimeMillis();
time +=(stop-start);
}
time /= i;
}
...
Niestety etykieta nie aktualizuje się na bieżąco, tylko po wykonaniu testów wyświetla 99.
Nie wiem co jest nie tak. Może wcale nie jest potrzebny nowy wątek tylko nie rozumiem jak działa repaint(), ale z tego co czytałem to właśnie aktualizuje zawartość komponentu dla której jest wywoływana poprzez wywołanie paint().
Będę wdzięczny za pomoc.