# signal zum thread der JProgressBar senden



## Steffilove (28. März 2007)

meine gui braucht sehr lange zum öffnen aufgrund eines verzeichnisbaums....

damit dieses zeit überbrückt wird, wird eine JProgressBar angezeigt.

mein Problem liegt jetzt dort dass, ich die JProgressBar mit der gui verbinden muss...

ich will jedes mal wenn ein neuer pfad des verzeichnisbaums aufgebaut wird ein signal zum thread (in methode run() ) geschickt welches den Fortschritt des Balkens nach vorn schiebt...

aber wie schick ich das signal zum thread...

das ist der quellcode vom baum:

```
public JPanel links() {
        // erzeugen eines Panels
        JPanel west = new JPanel();
        west.setPreferredSize(new Dimension(300, 400));
        // ein JTree
        DefaultMutableTreeNode wurzel = new DefaultMutableTreeNode("NamePC");
        // eine For Schleife die so oft es Wurzelverzeichnisse gibt durchläuft
        for (File root : File.listRoots()) {
            // node sind jeweils die Knoten(Wurzelverzeichnisse), root.getPath
            // ist der Pfad des Knotens
            DefaultMutableTreeNode node = new DefaultMutableTreeNode(root
                    .getPath());
            knoten.put(root.toString(), root.toString());
            // Abfrage ob die Knoten wirklich in der map sind
            if (knoten.containsKey(root.getPath())) {
                System.out.println("hat funktioniert"
                        + knoten.get(root.getPath()).toString());

Hier will ich den Sendebefehl einfügen(signal zum Thread)
            }

            // Die jeweilige Wurzel wird hinzugefügt
            wurzel.add(node);
            // Aufruf der Methode die die Verzeichnisse ermittelt
            PCverzeichnis verzeichnis = new PCverzeichnis();
            verzeichnis.weitereVerzeichnisse(node, root);

        }

        // ein baum der mit der wurzel beginnt
        JTree tree = new JTree(wurzel);
        tree.setPreferredSize(new Dimension(250, 100000));

        // wird dem Fenster hinzugefügt
        west.add(new JScrollPane(tree));

        // selection listener kann merken wenn die maus auf einen node klickt
        tree.getSelectionModel().addTreeSelectionListener(
                new TreeSelectionListener() {
                    public void valueChanged(TreeSelectionEvent e) {
                        path = e.getNewLeadSelectionPath();
                        // Der Liste die die angeklickten Knoten sammelt
                        // hinzufügen
                        pathList.add(path);

                        // pathTree ist das letzte Element im TreePath also der
                        // name
                        // und der Value in der Knoten map
                        pathTree = path.getLastPathComponent()
                                .toString();
                        System.out.println(pathTree);

                        textFeld.append(pathTree + "\n");

                        list1.add(pathTree);
                        PCverzeichnis pc = new PCverzeichnis();
                        String derPfadAusDemPath = pc.pfadKonstruieren(path);
                        // hier wird ein Entry Objekt der Map erstellt
                        for (Map.Entry<String, String> entryObjekt : knoten
                                .entrySet()) {

                            // wurzelSchlüssel ist die Wurzel ermittelt aus dem
                            // Schlüssel
                            // der map
                            String wurzelSchlüssel = entryObjekt.getKey()
                                    .subSequence(
                                            0,
                                            path.getPathComponent(1).toString()
                                                    .length()).toString();

                            // wenn die Liste (das was im Textfeld steht) einen
                            // Value aus dem
                            // Entry Objekt enthält und wenn die Wurzeln
                            // übereinstimmen
                            // ,dann soll der Value und der Key ausgegeben
                            // werden
                            if (list1.contains(entryObjekt.getValue())) {
                                if (derPfadAusDemPath.equals(entryObjekt
                                        .getKey())) {
                                    // if(path.getPathComponent(1).toString().equals(wurzelSchlüssel)){

                                    if (entryObjekt.getKey().equals(pathTree)) {
                                        System.out
                                                .println("es wurde eine wurzel angeklickt");
                                        knotenAuswahl.add(pathTree);
                                    } else {

                                        System.out.println("value "
                                                + knoten.get(entryObjekt
                                                        .getKey())
                                                + " und key "
                                                + entryObjekt.getKey());

                                        // System.out.println("die wurzel aus
                                        // dem key ermittelt:
                                        // "+wurzelSchlüssel);

                                    }
                                }
                            }
                        }
                    }
                });

        return west;
    }
```

wie müsste dann dieser befehl aussehen und vorallem was schreibe ich in run()?

p.s. kenn mich mit senden noch gar nicht aus... bitte einfache antworten...


LG


----------



## tobias_petry (28. März 2007)

die beste Lösung ist es, dass die links-Methode die Instanz der JProgressBar kennt und dann diesen selbst hochsetzt, das über Umwege erst an einen anderen Thread zu senden ist Quatsch


----------



## Steffilove (28. März 2007)

kannst du das näher beschreiben....


----------



## Thomas Darimont (29. März 2007)

Hallo,



> Hier will ich den Sendebefehl einfügen(signal zum Thread)


ein einfaches this.progressBar.setValue(...) reicht hier vollkommen aus...
nützt natürlich nur was wenn du von anfang an Weist wie viel "Arbeit" (max Wert der JProgressBar) du zu erledigen hast. Weist du das nicht würde ich die JProgressBar auf intermediate Modus setzen... das gaukelt dem User dann vor dass immer noch was passiert...

```
progressBar.setIndeterminate(true);
```

Ansonsten:

```
/**
 * 
 */
package de.tutorials;

import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import javax.swing.JFrame;
import javax.swing.JProgressBar;

/**
 * @author Tom
 * 
 */
public class ProgressBarExample extends JFrame {

    public ProgressBarExample() {
        super("ProgressBarExample");
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        final JProgressBar progressBar = new JProgressBar(1, 100);
        progressBar.setStringPainted(true);
        add(progressBar);

        //progressBar.setIndeterminate(true);
        
        Executors.newSingleThreadExecutor().execute(new Runnable() {
            public void run() {
                int i = 0;
                while (true) {
                    i++;
                    i %= 100;
                    try {
                        TimeUnit.MILLISECONDS.sleep(50);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    progressBar.setValue(i);
                }
            }
        });

        pack();
        setVisible(true);
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        new ProgressBarExample();
    }

}
```


Gruß Tom


----------

