Swing JProgressBar Aktualisiert sich nicht.

Chrno

Mitglied
jProgressBar Aktualisiert sich nicht.

Habe ein Synchroniesier Programm geschrieben.
Mithilfe der JProgressBar will ich den Fortschritt anzeigen, aber sie macht nichts und der Button bleibt auch drin.
Was kann ich da machen? ???:L

Chrno
 

dayaftereh

Top Contributor
Poste mal den Code? Hört sich nach eine DeadLock vom EventDiespatcher Thread an! hast du die Jprogress bar auf eine jDialog gemacht und modal = true gesetzt?
 

Chrno

Mitglied
Hoffe du kommst damit klar^^
Wenn noch fragen sind sag bescheid.

Nur das Wichtige!
MainGIU.class
Java:
package gui;

import java.io.File;
import javax.swing.JFileChooser;
import sync.*;

public class MainGUI extends javax.swing.JFrame {

    /** Creates new form MainGUI */
    public MainGUI(){
        initComponents();
    }                                     

private void btnSyncActionPerformed(java.awt.event.ActionEvent evt) {                                        
    if (flSource != null && flTarget != null) {
        Syncmaster sm = new Syncmaster(flSource, flTarget,[B]pbFull[/B]);
[B]        pbRun.setIndeterminate(true);[/B]
        sm.start();
[B]        pbRun.setIndeterminate(false);[/B]
    }
}                                       

public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new MainGUI().setVisible(true);
            }
        });
    }

syncmaster (Die Klasse die Arbeitet!)
Java:
package sync;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JProgressBar;

/**
 *
 * @author Conan
 */
public class Syncmaster {

    private File dirSource = null;
    private File dirTarget = null;
    private String dirSourceString = null;
    private String dirTargetString = null;
    private FileContainer target = null;
    private FileContainer source = null;
    private ArrayList<File> targetlist = null;
    private ArrayList<File> sourcelist = null;
    private JProgressBar pbFull = null;

    public Syncmaster(File flSource, File flTarget, JProgressBar pbFull) {
        this.dirSource = flSource;
        this.source = new FileContainer(flSource);
        if ((flSource.getPath() + "\\").contains("\\\\")) {
            dirSourceString = (flSource.getPath() + "\\").replace("\\\\", "");
        } else {
            dirSourceString = flSource.getPath();
        }
        this.dirTarget = flTarget;
        this.target = new FileContainer(flTarget);
        if ((flTarget.getPath() + "\\").contains("\\\\")) {
            dirTargetString = (flTarget.getPath() + "\\").replace("\\\\", "");
        } else {
            dirTargetString = flTarget.getPath();
        }
        this.pbFull = pbFull;
    }

    public void start() {
        source.analys();
        sourcelist = source.getList();
        show(sourcelist);
        target.analys();
        targetlist = target.getList();
//        show(targetlist);
//        compare();
        System.out.print("\n!!!!!!!!!!!!!!!!!!!!!!Backward!!!!!!!!!!!!!!!!!!!!!\n");
        String temp = dirSourceString;
        sourcelist = target.getList();
        dirSourceString = dirTargetString;
        targetlist = source.getList();
        dirTargetString = temp;
//        compare();
        System.out.println("\nFinish!!!");
    }

    public void compare() {
        System.out.println(dirSourceString+"\\");
        System.out.println(dirTargetString+"\\");
        for (int i = 0; i < sourcelist.size(); i++) {
            File a = sourcelist.get(i);
[B]            pbFull.setValue(calcProcessBar(i));[/B]
            if (a.isDirectory()) {
                System.out.print("mkdir: " + a.getPath() + "\\");
                new File(a.getPath().replace(dirSourceString, dirTargetString)).mkdirs();
                System.out.print(" end\n");
//                System.out.println("!!!!!!!!!!!!!!!!!!"+a.getPath());
//                System.out.println("!!!!!!!!!!!!!!!!!!"+a.getPath().replace(flSource.getPath(), flTarget.getPath()));
            } else {
                if (targetlist.isEmpty()) {
                    File temp = new File(a.getPath().replace(dirSourceString, dirTargetString).replace(a.getName(), ""));
                    System.out.print("mkdir: " + temp.getPath() + "\\");
                    temp.mkdirs();
                    System.out.print(" end\n");
                    copy(a, new File(a.getPath().replace(dirSourceString, dirTargetString)));
                } else {
                    for (File b : targetlist) {
//                    System.out.println("!!!!!!!!!!!!!!!!!!OK");
                        if (a.getPath().replace(dirSourceString, "").equals(b.getPath().replace(dirTargetString, ""))) {
//                        System.out.println("!!!!!!!!!!!!!!!!!!OK2");
                            checkDate(a, b);
                            break;
                        } else {
                            if (b.equals(targetlist.get(targetlist.size() - 1))) {
//                            System.out.println("!!!!!!!!!!!!!!!!!!OK3");
                                new File(a.getPath().replace(dirSourceString, dirTargetString).replace(a.getName(), "")).mkdirs();
                                copy(a, new File(a.getPath().replace(dirSourceString, dirTargetString)));
                                break;
                            }
                        }
                    }
                }
            }
        }
    }

    private void checkDate(File a, File b) {
        if (a.lastModified() > b.lastModified()) {
            copy(a, b);
        }
    }

    private void copy(File source, File target) {
        System.out.print("copy: " + source.getPath());
        FileInputStream read = null;
        FileOutputStream write = null;
        try {
            read = new FileInputStream(source);
            write = new FileOutputStream(target);
            byte[] buffer = new byte[4096];
            int length;
            while ((length = read.read(buffer)) > 0) {
                System.out.print(".");
                write.write(buffer, 0, length);
            }
            System.out.print("  end\n");
        } catch (IOException ex) {
            Logger.getLogger(Syncmaster.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                read.close();
                write.close();
            } catch (IOException ex) {
                Logger.getLogger(Syncmaster.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

    }

[B]    private int calcProcessBar(int a) {
        double pm = 1000. / (double) targetlist.size() * (double) a;
        if (pm * 10 % 10 > 5) {
            pm = pm + 0.5;
        }
        return (int) pm;
    }[/B]

    private void show(ArrayList<File> filelist) {
        System.out.println(dirSource);
        System.out.println(dirTarget);
        for (File file : filelist) {
            if (file.isDirectory()) {
                System.out.println(file.getPath() + "\\");
            } else {
                System.out.println(file.getPath());
            }
        }
        System.out.println("Nächster Ordner!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
    }
}
 
Zuletzt bearbeitet:

dayaftereh

Top Contributor
Also ich weiß nicht ganz genau was du da Machst! aber versuche mal deine sm.start(); in einem Neuen Therad auszuführen! Du Bekommst ein Event vom EventDispatcher Thread in der Methode : btnSyncActionPerformed(java.awt.event.ActionEvent evt);
So jetzt erzugst du deinen Syncmaster und Startest den auch mit dem EventDispatcher Thread, das heißt er ist sollange Blockiert, bist du deine Aufgaben abgearbeitet hast! wenn du jetzt was neu Zeichen willst,z.b die JprogressBar bekomment einen Neuen wert, geht das nicht weil der EventDispatcher Thread blockiert ist!
Versuche mal:
Java:
		Thread t = new Thread(new Runnable() {

			public void run() {
				Syncmaster sm = new Syncmaster(flSource, flTarget, pbFull);
				pbRun.setIndeterminate(true);
				sm.start();
				pbRun.setIndeterminate(false);
			}
		});
		t.start();

Denk aber Dran, du hast dan 2 Therads Laufen, wegen theradsave! könnte Problemme machen, wenn der EventDispatcher Thread neu zeichnen will und die JprogressBar benötigt aber in dem moment setzt du einen neuen Wert!

Hoffe ich konnte Helfen!
 

Ebenius

Top Contributor
Wenn Du sowas versuchst, dann stell bitte die Synchronität zum EDT her:
Java:
		Thread t = new Thread(new Runnable() {

			public void run() {
				Syncmaster sm = new Syncmaster(flSource, flTarget, pbFull);
				SwingUtilities.invokeLater(new Runnable() {
					@Override
					public void run() {
						pbRun.setIndeterminate(true);
					}
				});
				sm.start();
				SwingUtilities.invokeLater(new Runnable() {
					@Override
					public void run() {
						pbRun.setIndeterminate(false);
					}
				});
			}
		});
		t.start();
Ebenius
 

Chrno

Mitglied
Danke hatte ich voll vergessen:oops: alles läuft bestens:D

@Ebenius was meinst du damit? Habe es so gemacht:

Java:
package gui;

import com.sun.java.swing.plaf.windows.WindowsLookAndFeel;
import java.io.File;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import sync.*;

/**
 *
 * @author barracden
 */
public class MainGUI extends javax.swing.JFrame {

    private File flSource = null;
    private File flTarget = null;
    private Syncmaster sm = null;
    private About About = null;
    private int[] option={0};

    /** Creates new form MainGUI */
    public MainGUI() {
        try {
            UIManager.setLookAndFeel(new WindowsLookAndFeel());
        } catch (UnsupportedLookAndFeelException ex) {
            Logger.getLogger(MainGUI.class.getName()).log(Level.SEVERE, null, ex);
        }
        initComponents();
    }

    private void btnSourceActionPerformed(java.awt.event.ActionEvent evt) {                                          
        JFileChooser search = new JFileChooser();
        search.setDialogType(JFileChooser.OPEN_DIALOG);
        search.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        int option = search.showDialog(this, "Open");
        if (option == JFileChooser.APPROVE_OPTION) {
            flSource = search.getSelectedFile();
            txtSource.setText((flSource.getPath() + "\\").replace("\\\\", "\\"));
        }
}                                         

    private void btnTargetActionPerformed(java.awt.event.ActionEvent evt) {                                          
        JFileChooser search = new JFileChooser();
        search.setDialogType(JFileChooser.OPEN_DIALOG);
        search.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        int option = search.showDialog(this,"Öffnen");
        if (option == JFileChooser.APPROVE_OPTION) {
            flTarget = search.getSelectedFile();
            txtTarget.setText((flTarget.getPath() + "\\").replace("\\\\", "\\"));
        }
}                                         

private void btnScActionPerformed(java.awt.event.ActionEvent evt) {                                      
    if (btnSc.getText().equals("Sync")) {
        if (flSource != null && flTarget != null) {
            sm = new Syncmaster(flSource, flTarget, pbFull, pbRun,btnSc,option);
            btnSc.setText("Cancel");
            pbRun.setIndeterminate(true);
            sm.start();
        }
    }else{
        sm.stop();
        btnSc.setText("Sync");
        pbRun.setIndeterminate(false);
    }

}                                     

private void jMenuItem3ActionPerformed(java.awt.event.ActionEvent evt) {                                           
    About=new About(this,true);
    About.setVisible(true);
}                                          

private void rbmQZZQActionPerformed(java.awt.event.ActionEvent evt) {                                        
    option[0]=0;
}                                       

private void rbmQZActionPerformed(java.awt.event.ActionEvent evt) {      
    option[0]=1;
}                                     

private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) {                                           
    System.exit(0);
}                                          

public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new MainGUI().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton btnSc;
    private javax.swing.JButton btnSource;
    private javax.swing.JButton btnTarget;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenu jMenu2;
    private javax.swing.JMenu jMenu3;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuItem jMenuItem2;
    private javax.swing.JMenuItem jMenuItem3;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JProgressBar pbFull;
    private javax.swing.JProgressBar pbRun;
    private javax.swing.ButtonGroup rbgRichtung;
    private javax.swing.JRadioButtonMenuItem rbmQZ;
    private javax.swing.JRadioButtonMenuItem rbmQZZQ;
    private javax.swing.JTextField txtSource;
    private javax.swing.JTextField txtTarget;
    // End of variables declaration                   

}

Java:
package sync;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JProgressBar;

/**
 *
 * @author Conan
 */
public class Syncmaster extends Thread {

    private File dirSource = null;
    private File dirTarget = null;
    private String dirSourceString = null;
    private String dirTargetString = null;
    private FileContainer target = null;
    private FileContainer source = null;
    private ArrayList<File> targetlist = null;
    private ArrayList<File> sourcelist = null;
    private JProgressBar pbFull = null;
    private JProgressBar pbRun = null;
    private JButton sc;
    private int[] option;

    public Syncmaster(File flSource, File flTarget, JProgressBar pbFull, JProgressBar pbAction, JButton sc, int[] option) {
        this.dirSource = flSource;
        this.source = new FileContainer(flSource);
        if ((flSource.getPath() + "\\").contains("\\\\")) {
            dirSourceString = (flSource.getPath() + "\\").replace("\\\\", "");
        } else {
            dirSourceString = flSource.getPath();
        }
        this.dirTarget = flTarget;
        this.target = new FileContainer(flTarget);
        if ((flTarget.getPath() + "\\").contains("\\\\")) {
            dirTargetString = (flTarget.getPath() + "\\").replace("\\\\", "");
        } else {
            dirTargetString = flTarget.getPath();
        }
        this.pbFull = pbFull;
        this.pbRun = pbAction;
        this.sc = sc;
        this.option = option;
    }

    @Override
    public void run() {
        source.analys();
        sourcelist = source.getList();
//        show(sourcelist); 
        target.analys();
        targetlist = target.getList();
//        show(targetlist);
        compare();
        pbFull.setValue(1000);
        if (option[0] == 0) {
            System.out.print("\n!!!!!!!!!!!!!!!!!!!!!!Backward!!!!!!!!!!!!!!!!!!!!!\n");
            String temp = dirSourceString;
            sourcelist = target.getList();
            dirSourceString = dirTargetString;
            targetlist = source.getList();
            dirTargetString = temp;
            compare();
            pbFull.setValue(1000);
        }
        System.out.println("\nFinish!!!");
        pbRun.setIndeterminate(false);
        sc.setText("Sync");
    }

    public void compare() {
        System.out.println(dirSourceString + "\\");
        System.out.println(dirTargetString + "\\");
        for (int i = 0; i < sourcelist.size(); i++) {
            File a = sourcelist.get(i);
            pbFull.setValue(calcProcessBar(i));
            if (a.isDirectory()) {
                System.out.print("mkdir: " + a.getPath() + "\\");
                new File(a.getPath().replace(dirSourceString, dirTargetString)).mkdirs();
                System.out.print(" end\n");
            } else {
                if (targetlist.isEmpty()) {
                    File temp = new File(removeLast(a.getPath().replace(dirSourceString, dirTargetString), a.getName()));
                    System.out.print("mkdir: " + temp.getPath() + "\\");
                    temp.mkdirs();
                    System.out.print(" end\n");
                    copy(a, new File(a.getPath().replace(dirSourceString, dirTargetString)));
                } else {
                    for (File b : targetlist) {
                        if (a.getPath().replace(dirSourceString, "").equals(b.getPath().replace(dirTargetString, ""))) {
                            checkDate(a, b);
                            break;
                        } else {
                            if (b.equals(targetlist.get(targetlist.size() - 1))) {
                                new File(removeLast(a.getPath().replace(dirSourceString, dirTargetString), a.getName())).mkdirs();
                                copy(a, new File(a.getPath().replace(dirSourceString, dirTargetString)));
                                break;
                            }
                        }
                    }
                }
            }
        }
    }

    private void checkDate(File a, File b) {
        if (a.lastModified() > b.lastModified()) {
            copy(a, b);
        }
    }

    private void copy(File source, File target) {
        System.out.print("copy: " + source.getPath());
        FileInputStream read = null;
        FileOutputStream write = null;
        try {
            read = new FileInputStream(source);
            write = new FileOutputStream(target);
            byte[] buffer = new byte[4096];
            int length;
            while ((length = read.read(buffer)) > 0) {
                System.out.print(".");
                write.write(buffer, 0, length);
            }
            System.out.print("  end\n");
        } catch (IOException ex) {
            System.out.println("Abbruch duch benutzer oder Fehler!!");
        } finally {
            try {
                read.close();
                write.close();
            } catch (IOException ex) {
                Logger.getLogger(Syncmaster.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

    }

    private int calcProcessBar(int a) {
        double pm = 1000. / sourcelist.size();
        pm = pm * (double) a;
        if (pm * 10 % 10 > 5) {
            pm = pm + 0.5;
        }
        return (int) pm;
    }

    private void show(ArrayList<File> filelist) {
        System.out.println(dirSource);
        System.out.println(dirTarget);
        for (File file : filelist) {
            if (file.isDirectory()) {
                System.out.println(file.getPath() + "\\");
            } else {
                System.out.println(file.getPath());
            }
        }
        System.out.println("Nächster Ordner!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
    }

    public static String removeLast(String s, String n) {
        String output = "";
        char[] vs = s.toCharArray();
        for (int i = 0; i < s.length() - n.length(); i++) {
            output = output + vs[i];
        }
        return output;
    }
}
 
Zuletzt bearbeitet:

Ebenius

Top Contributor
Die Zeilen 62, 71, 74 und 83 im SyncMaster greifen auf Swing-Komponenten zu (JProgressBar). Swing will, dass alle Änderungen an Komponenten vom EDT gemacht werden. Diese Zeilen werden aber im SyncMaster-Thread abgearbeitet. Also müssen die Zugriffe in jeder der Zeilen geändert und und die Aufrufe an den EDT abgegeben werden; zum Beispiel per [c]invokeLater(...)[/c].

Ebenius
 

Chrno

Mitglied
Habe erst seit kurzem mit Threads angefangen. Kannst du mir sagen wie genau das mit dem EDT geht?
Mein Lehrer hat auch gesagt das es auch nicht gut sei alle swing Komponente im Konstruktor zu übergeben. Aber wie kann ich sonst die Werte ämdern, da ich von einen non-static Klasse nicht auf eine Static Klasse zugreifen darf/kann?
 

Ebenius

Top Contributor
AWT arbeitet mit Ereignissen (Events). Diese Ereignisse stehen in einer Warteschlange (der EventQueue). Ans Ende dieser Wartschlange werden immer wieder Ereignisse angefügt, zum Beispiel: (A) Aufforderung Neuzeichnen einer Komponente, (B) Eingabe-Ereignisse (Keyboard-Taste gedrückt, Maus bewegt), etc. Der EDT (Event Dispatch Thread) ist ein bestimmter Thread, den AWT startet. Dieser arbeitet die Warteschlange ab, indem er ein Ereignis nach dem anderen in der Reihenfolge des Einfügens (FIFO, First In - First Out) entnimmt und abarbeitet. Dieser Thread ruft dann (A) die entsprechende Zeichenfunktion der Komponente auf oder (B) die Methode zum Auswerten des Eingabe-Ereignisses.

AWT ist bis auf ein paar wenige Ausnahmen nicht Thread-sicher. Das heißt, dass man Änderungen an UI-Komponenten nicht aus irgendeinem Thread heraus machen darf. Alle Änderungen müssen aus dem EDT gemacht werden. Wenn man also einen eigenen Thread startet, dann darf dieser keine Änderungen an UI-Komponten vornehmen. Wenn man dies misachtet, kann es zu Problemen kommen. Zum Beispiel könnte die Komponente per EDT gerade irgendetwas zeichnen, während ein anderer Thread die zu zeichnenden Daten verändert. Folge davon könnte eine falsch gezeichnete Komponente sein, oder eine Exception aus verschiedenen Gründen, oder, oder, oder. Auch wenn es augenscheinlich keine Probleme gibt, heißt das nicht, dass nicht mit einer anderen Java-Maschine, oder auf einem anderen Betriebssystem, oder auf anderer Hardware, oder zu einem anderen Zeitpunkt doch Probleme auftreten.

Man muss natürlich nicht vollständig darauf verzichten, aus dem anderen Thread Veränderungen an UI-Komponenten hervorzurufen. Wenn man das tut, dann legt man einfach ein entsprechendes Ereignis in die Warteschlange. Dazu gibt es die Methode [c]invokeLater(...)[/c] und die seltener benötigte Methode [c]invokeAndWait(...)[/c]. Diese Methoden finden sich in der Klasse [c]SwingUtilities[/c][SIZE="-1"]*[/SIZE].

Statt nun also aus dem anderen Thread heraus den [c]JProgressBar[/c] zu verändern ...
Java:
pbRun.setIndeterminate(true);
... erzeugt man eine Instanz einer Klasse die das Interface [c]Runnable[/c] implementiert (meist als anonyme Implementierung) und innerhalb der Methode [c]run()[/c] die gewünschte Änderung ausführen kann ...
Java:
new Runnable() {
  @Override
  public void run() {
    pbRun.setIndeterminate(true);
  }
}
... und übergibt dieses Objekt der Methode [c]invokeLater(...)[/c]:
Java:
SwingUtilities.invokeLater(new Runnable() {
  @Override
  public void run() {
    pbRun.setIndeterminate(true);
  }
});
Diese Methode wird nun ein entsprechendes Ereignis in die Warteschlange legen; in etwa eine Arbeitsanweisung "Führe dieses [c]Runnable[/c] aus". Der EDT arbeitet alle vorher eingegangen Ereignisse ab und wenn das eben angesprochene Ereignis an der Reihe ist, dann ruft er die Methode [c]run()[/c] auf die den [c]JProgressBar[/c] verändert.

[SIZE="-1"]* Für AWT finden sich die Methoden auch in der [c]EventQueue[/c], wenn man Swing benutzt, nutzt man aber den Aufruf über die Klasse [c]SwingUtilities[/c][/SIZE]

(Edit) Nachtrag:
Seit Java 6 gibt es die SwingWorker-Klasse die in Deinem Fall ebenfalls sehr hilfreich sein kann. Zu beiden Ansätzen findest Du in diesem FAQ-Thema Anleitungen: [thread=7395]FAQ: ProgressBars, Algorithmen und Multithreading[/thread].

Ebenius
 
Zuletzt bearbeitet:

Ebenius

Top Contributor
Mein Lehrer hat auch gesagt das es auch nicht gut sei alle swing Komponente im Konstruktor zu übergeben. Aber wie kann ich sonst die Werte ämdern, da ich von einen non-static Klasse nicht auf eine Static Klasse zugreifen darf/kann?
Da hat Dein Lehrer recht. :) Man kann die Klassen entkoppeln; zum Beispiel über das Entwurfsmuster Beobachter (Observer). Siehe auch: Wikipedia:Observer (Entwurfsmuster).

Ein nicht ganz so triviales, dafür aber sehr Java™-typisches Beispiel, bestehend aus einer Ereignis-Klasse:
Java:
import java.util.EventObject;

public class ProgressEvent extends EventObject {

  private final int minValue;
  private final int maxValue;
  private final int currentValue;
  private final boolean finished;
  private final boolean canceled;

  public ProgressEvent(Object source,
                       int minValue,
                       int maxValue,
                       int currentValue,
                       boolean finished,
                       boolean canceled) {
    this.minValue = minValue;
    this.maxValue = maxValue;
    this.currentValue = currentValue;
    this.finished = finished;
    this.canceled = canceled;
  }

  public int getMinValue()     { return minValue; }
  public int getMaxValue()     { return maxValue; }
  public int getCurrentValue() { return currentValue; }
  public boolean isFinished()  { return finished; }
  public boolean isCanceled()  { return canceled; }

  // TODO: Implement toString()
}
... und einer Zuhörer-Schnittstelle:
Java:
import java.util.EventListener;

public interface ProgressListener extends EventListener {

  void progressChanged(ProgressEvent e);
}
... und den zugehörigen Methoden die in den SyncMaster gehören:
Java:
import java.util.List;
...
private final List<ProgressListener> listeners = new LinkedList<ProgressListener>();

public void addProgressListener(ProgressListener l) {
  listeners.add(l);
}

public void removeProgressListener(ProgressListener l) {
  listeners.remove(l);
}

/* protected methods for sending events to our listeners */

protected void fireProgressChanged(int minValue, int maxValue, int currentValue) {
  ProgressEvent event = null; // create only once if listeners available
  for (ProgressListener l : listeners) {
    if (event == null) {
      event = new ProgressEvent(this, minValue, maxValue, currentValue, false, false);
    }
    l.progressChanged(event);
  }
}

protected void fireProgressCanceled(int minValue, int maxValue, int currentValue) {
  ProgressEvent event = null; // create only once if listeners available
  for (ProgressListener l : listeners) {
    if (event == null) {
      event = new ProgressEvent(this, minValue, maxValue, currentValue, false, true);
    }
    l.progressChanged(event);
  }
}

protected void fireProgressFinished(int minValue, int maxValue) {
  ProgressEvent event = null; // create only once if listeners available
  for (ProgressListener l : listeners) {
    if (event == null) {
      event = new ProgressEvent(this, minValue, maxValue, maxValue, true, false);
    }
    l.progressChanged(event);
  }
}
Der SyncMaster würde dann keinen [c]JProgressBar[/c] mehr kennen und statt der Änderungen an den Balken [c]fireProgressChanged(...)[/c], [c]fireProgressCanceled(...)[/c] oder [c]fireProgressFinished(...)[/c] aufrufen. Die Instanzvariablen [c]pbRun[/c] und [c]pbFull[/c], deren Initialisierung im Konstruktor und die gleichnamigen Konstruktorargumente würden ebenfalls wegfallen. Gleiches gilt übrigens für die (ungenutzte) Instanzvariable [c]sc[/c] sowie deren Initialisierung im Konstruktor nebst Argument.

Deine Methode [c]btnScActionPerformed(...)[/c] würdest Du dann in etwa so abändern:
[java=57]private void btnScActionPerformed(java.awt.event.ActionEvent evt) {
if (btnSc.getText().equals("Sync")) {
if (flSource != null && flTarget != null) {
sm = new Syncmaster(flSource, flTarget, pbFull, pbRun,btnSc,option);
sm.addProgressListener(new ProgressListener() {
@Override
public void progressChanged(final ProgressEvent e) {
// Progress events are not sent on EDT; so invoke the GUI changes per invokeLater
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// TODO: check the event state and update the button and the progress bars
}
});
}
});
// Move to the TODO-Block above
// btnSc.setText("Cancel");
// pbRun.setIndeterminate(true);
sm.start();
}
}else{
sm.stop();
// Move to the TODO-Block above
// btnSc.setText("Sync");
// pbRun.setIndeterminate(false);
}
}
[/code]
Der Code oben ist im Browser getippt; also fehlende Imports und Rechtschreibfehler bitte selber beheben.

Ebenius
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
L JProgressBar wird nicht mehr aktualisiert AWT, Swing, JavaFX & SWT 2
J Rekursive Methode JProgressBar AWT, Swing, JavaFX & SWT 4
T JProgressbar während actionListener updaten AWT, Swing, JavaFX & SWT 1
M Swing JProgressbar und Outoputstream probleme AWT, Swing, JavaFX & SWT 2
A Swing JProgressbar im Windows Look & Feel Farbanpassung AWT, Swing, JavaFX & SWT 2
G JProgressBar: Verständnis Problem AWT, Swing, JavaFX & SWT 3
S Swing JProgressBar läuft nicht mit AWT, Swing, JavaFX & SWT 12
T Swing JProgressBar mit String unschön AWT, Swing, JavaFX & SWT 5
H jprogressbar während datenabfrage anzeigen AWT, Swing, JavaFX & SWT 5
P Problem Thread.sleep() und JProgressBar AWT, Swing, JavaFX & SWT 7
E Swing JProgressBar updaten AWT, Swing, JavaFX & SWT 3
D Swing JProgressBar soll ende erkennen AWT, Swing, JavaFX & SWT 4
V Swing JProgressBar aktualisieren AWT, Swing, JavaFX & SWT 14
M JProgressBar updatet nicht AWT, Swing, JavaFX & SWT 4
T Swing JProgressBar Indeterminate bleibt stehen bei neuem Fenster AWT, Swing, JavaFX & SWT 6
A JProgressBar updaten abhängig vom Output eines externen Skripts AWT, Swing, JavaFX & SWT 2
M JProgressBar für einen Thread AWT, Swing, JavaFX & SWT 14
J JProgressBar Indeterminate AWT, Swing, JavaFX & SWT 17
J JProgressBar Farbverlauf AWT, Swing, JavaFX & SWT 2
O Probleme mit JProgressBar bei der Statusanzeige AWT, Swing, JavaFX & SWT 5
S jProgressbar von einem Download AWT, Swing, JavaFX & SWT 6
C Swing JProgressBar in JDialog wird nicht angezeigt AWT, Swing, JavaFX & SWT 6
S Swing StatusLeiste mit JProgressBar AWT, Swing, JavaFX & SWT 4
S JProgressBar in Abhängigkeit eines FileInputStreams AWT, Swing, JavaFX & SWT 2
S (Applets) JProgressBar wird erst am Ende angezeigt AWT, Swing, JavaFX & SWT 13
S Problem mit JProgressBar AWT, Swing, JavaFX & SWT 3
E Swing DB Zugriff mit JProgressBar?! AWT, Swing, JavaFX & SWT 8
M JProgressBar Look and Feel AWT, Swing, JavaFX & SWT 5
C JProgressBar und JLabel AWT, Swing, JavaFX & SWT 5
K JProgressBar transparent AWT, Swing, JavaFX & SWT 10
M JProgressBar AWT, Swing, JavaFX & SWT 2
K JProgressBar für Serialisierung AWT, Swing, JavaFX & SWT 6
multiholle [JProgressBar] Raster deaktivieren AWT, Swing, JavaFX & SWT 14
M JProgressBar übereinander legen? AWT, Swing, JavaFX & SWT 3
B JProgressbar wird nicht aktualisert, trotz Threads AWT, Swing, JavaFX & SWT 6
G JProgressBar actionPerformedMethode und SwingUI thread AWT, Swing, JavaFX & SWT 36
S JProgressBar und Threads AWT, Swing, JavaFX & SWT 11
G Repaint bei JProgressBar AWT, Swing, JavaFX & SWT 3
A Richtiger Umgang mit jProgressBar AWT, Swing, JavaFX & SWT 2
H JProgressBar in TableColumn von JTable setzen/abfragen AWT, Swing, JavaFX & SWT 5
B JProgressBar: wie muss ich das lösen? AWT, Swing, JavaFX & SWT 4
R JProgressBar-Verhalten AWT, Swing, JavaFX & SWT 5
G JProgressbar AWT, Swing, JavaFX & SWT 8
A JProgressBar: Farbe im Windows Look&Feel ändern. AWT, Swing, JavaFX & SWT 1
C JProgressBar und ihre Tücken AWT, Swing, JavaFX & SWT 8
G JProgressBar in JTable AWT, Swing, JavaFX & SWT 6
G Probleme mit JProgressbar auf JPanel in JFrame AWT, Swing, JavaFX & SWT 6
F JProgressBar und NullPointerException AWT, Swing, JavaFX & SWT 4
T JProgressBar und CMP Bean AWT, Swing, JavaFX & SWT 2
J JProgressBar flackert AWT, Swing, JavaFX & SWT 14
S JProgressBar zu JOptionPane hinzufügen. AWT, Swing, JavaFX & SWT 8
M Swinganwendung Threads mit JProgressBar AWT, Swing, JavaFX & SWT 7
L JProgressbar möglichst genau AWT, Swing, JavaFX & SWT 3
G JProgressBar + Thread + Client AWT, Swing, JavaFX & SWT 10
R JProgressBar ohne Threads verwenden AWT, Swing, JavaFX & SWT 6
I JProgressBar String anzeigen, danach wieder normale Ansicht AWT, Swing, JavaFX & SWT 3
G JProgressBar AWT, Swing, JavaFX & SWT 8
U JProgressBar in umgekehrter Richtung AWT, Swing, JavaFX & SWT 2
S JProgressBar einbinden AWT, Swing, JavaFX & SWT 5
H JProgressBar AWT, Swing, JavaFX & SWT 6
T JProgressBar und JPG AWT, Swing, JavaFX & SWT 2
D Problem mit JProgressBar und Threads AWT, Swing, JavaFX & SWT 7
S Ausgabe aktualisiert sich nur nach 2. Klick AWT, Swing, JavaFX & SWT 17
F JList aktualisiert nicht AWT, Swing, JavaFX & SWT 24
K Swing GUI aktualisiert nicht richtig AWT, Swing, JavaFX & SWT 5
J Meine ProgBar und ProgIndi werden nicht aktualisiert AWT, Swing, JavaFX & SWT 28
M JTextArea wird nicht aktualisiert (ActionListener-Problem) AWT, Swing, JavaFX & SWT 1
F AWT Grafik wird nicht richtig aktualisiert AWT, Swing, JavaFX & SWT 2
J AWT choice mit viel Auswahl aktualisiert sich nicht korrekt beim scrollen?! AWT, Swing, JavaFX & SWT 3
A Vier gewinnt: GUI aktualisiert sich nicht AWT, Swing, JavaFX & SWT 12
T Java Swing Oberfläche aktualisiert sich nicht AWT, Swing, JavaFX & SWT 2
J Swing Progressbar aktualisiert sich nicht AWT, Swing, JavaFX & SWT 17
C JLabel wird nicht aktualisiert AWT, Swing, JavaFX & SWT 3
D JTabke aktualisiert sich nicht AWT, Swing, JavaFX & SWT 4
El_Lobo Swing Swing TextArea und JTextField werden nicht aktualisiert AWT, Swing, JavaFX & SWT 2
N Tabellenzelle wird bei JCombBox mit eigenem Datentyp nicht aktualisiert AWT, Swing, JavaFX & SWT 7
F Timer welches JPanel aktualisiert AWT, Swing, JavaFX & SWT 6
N JLabel Text aktualisiert sich nicht AWT, Swing, JavaFX & SWT 2
K JTable wird nicht aktualisiert, wenn Filter gesetzt ist AWT, Swing, JavaFX & SWT 9
R AWT JList wird nur zufällig auf der GUI aktualisiert AWT, Swing, JavaFX & SWT 5
P Swing GUI aktualisiert sich nicht AWT, Swing, JavaFX & SWT 7
S Jtable wird nicht aktualisiert AWT, Swing, JavaFX & SWT 8
M Graphics-Objekt aktualisiert sich nicht AWT, Swing, JavaFX & SWT 2
I Swing Warten, bis eine GUI-Komponente aktualisiert ist? AWT, Swing, JavaFX & SWT 4
C (Swing)GUI-Elemente werden nicht aktualisiert. AWT, Swing, JavaFX & SWT 2
S Swing JList in JScrollPane aktualisiert sich nicht AWT, Swing, JavaFX & SWT 6
PAX JList aktualisiert zu langsam beim Hinzufügen von Einträgen AWT, Swing, JavaFX & SWT 6
C JTree wird nicht aktualisiert AWT, Swing, JavaFX & SWT 3
A Gui Komponenten werden nicht von selbst aktualisiert! AWT, Swing, JavaFX & SWT 2
K Textfeld wird nur jedes zweite Mal aktualisiert AWT, Swing, JavaFX & SWT 3
T JPanel aktualisiert nicht AWT, Swing, JavaFX & SWT 3
C JTable aktualisiert die Anzeige nicht AWT, Swing, JavaFX & SWT 2
R GUI wird nicht richtig aktualisiert AWT, Swing, JavaFX & SWT 5
G JList wird in einem Applet nur teilweise aktualisiert AWT, Swing, JavaFX & SWT 12
G JTable (AbstractTableModel) wird nicht aktualisiert AWT, Swing, JavaFX & SWT 2
J JTextArea wird nicht aktualisiert bei Zugriff von außerhalb AWT, Swing, JavaFX & SWT 2
A JTree wird erst nach Klick aktualisiert AWT, Swing, JavaFX & SWT 2
S JLabel aktualisiert sich nicht AWT, Swing, JavaFX & SWT 4
G Tabelle aktualisiert sich erst, nachdem man auf sie klickt! AWT, Swing, JavaFX & SWT 4
B TreeViewer für das Dateisystem, der sich selbst aktualisiert AWT, Swing, JavaFX & SWT 8

Ähnliche Java Themen

Neue Themen


Oben