Der Fortschrittsbalken wird nicht während der Ausführung der Bearbeitungsklasse gleichzeiig aktualisiert. Warum?
Code:
//dies ist eine innere Klasse der Gui und ruft die Methoden der Bearbeitungsklasse auf
class MedThread extends Thread
{
public void run ()
{
long startTime=System.currentTimeMillis();
String inputBildStr = eingabeField.getText();
String outputBildStr = ausgabeField.getText();
FilterGray test = new FilterGray (inputBildStr);
String str = pixelField.getText();
int z = Integer.parseInt(str);
test.filter(z); // hier wird der Bildfilter aufgerufen
test.write(outputBildStr);
long endTime=System.currentTimeMillis();
long diff=endTime-startTime;
timeField.setText(String.valueOf(diff)+" ms");
image2 = Toolkit.getDefaultToolkit().getImage( outputBildStr );
scaled = scale(image2);
outputBild = new JLabel(new ImageIcon(scaled));
middle.remove(empty);
middle.add(outputBild);
middle.validate();
}
}
// dies passiert wenn der startbutton gedrückt wird
class GoLauscher implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
MedThread thread = new MedThread();
thread.start();
FilterGray.go = true;
progressBar.setMaximum(1120);
while (FilterGray.go == true)
{
try // hier wird die GUI nicht aktualisiert
{
Thread.sleep(1000);
progressBar.setValue(FilterGray.progress);
progressBar.validate(); // das ändert nix
progressPanel.validate(); // das ändert auch nix
System.out.println(FilterGray.progress); // diese Werte werden korrekt zurückgegeben
}
catch (InterruptedException f)
{
return;
}
}
}
}
// der benötigte Teil der Bearbeitungsklasse (FilterGray)
public void filter(int x)
{
go = true;
LinkedList list = new LinkedList(); // Liste anlegen
progress = 0; //progressbar zähler 0 setzen
max = (inImage.getWidth()-x); //progressbarmaximum ermitteln
for(int i=x; i<inImage.getWidth()-x; i++)
{
progress = i; //progressbarzähler erhöhen
for(int j=x; j<inImage.getHeight()-x; j++) // Bild durchgehen
{
int h, w, count = 0;
w = h = x*(-1);
int a = ((2*x+1)*(2*x+1));
for (; count<a; count++) // umliegende Bildpunkte berechnen
{
int br=(inImage.getRGB(i+w, j+h) >> 16) & 0xff;
list.add(new Integer(pixels[i-w][j-h])); // Bildpunkt in Liste einfügen
if (w==x)
{
w = x*(-1);
h++;
}
else
w++;
if (h>x)
{
h = x*(-1);
}
}
int value = ((Integer)QuickSelect.quickSelect(list,list.size()/2+1)).intValue(); // mittleres Element mittels QuickSelect suchen
poxels[i][j]= value; // Wert in AusgabeBild einfügen
}
}
go = false;
}