# alle Ordner in einem Ordner anzeigen(Jlist)



## JDE4D (29. Apr 2010)

```
private void ChsDictActionPerformed(java.awt.event.ActionEvent evt) {                                        
        String filename = File.separator + "tmp";
        JFrame frame = null;
        JFileChooser fc = new JFileChooser(new File(filename));
        fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        int returnVal = fc.showOpenDialog(frame);
        File selFile = fc.getSelectedFile();

        String loctxt = selFile.getPath();
        JLabel test = new JLabel();
        File SubjDirs = new File(loctxt);
        String[] SubjDirsList = SubjDirs.list();
        jList1 = new JList();

        if (returnVal == JFileChooser.APPROVE_OPTION) {
            CurrLoc.setText(loctxt);
//            
            DefaultListModel model = new DefaultListModel();
            jList1.setModel(model);
            jList1.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
            jList1.setLayoutOrientation(JList.HORIZONTAL_WRAP);
            jList1.setVisibleRowCount(-1);
            JScrollPane listscr = new JScrollPane(jList1);
            listscr.setPreferredSize(new Dimension(238, 168));

            for (String txtloc : SubjDirsList) {
                model.addElement(txtloc);
//                jList1.add(listscr);
            }
        }
}
```

ich habe hier ein MenüItem  das einen FileChooser aufruft. Beim Bestätigen des FC soll ein textfeld mit dem Pfad gefüllt werden (als text - klappt auch).

problem ist jetzt, dass ich es i-wie hinbekommen will das er in diesem Pfad wo nur ordner existieren, in einer JList ausgibt. Das heisst die Namen der Ordner sollen in der JList stehen. Möglich?


PS: Es gibt ein ähnlichen Thread aber bin nicht schlau raus geworden.

LG,

dead


----------



## The_S (29. Apr 2010)

JDE4D hat gesagt.:


> problem ist jetzt, dass ich es i-wie hinbekommen will das er in diesem Pfad wo nur ordner existieren, in einer JList ausgibt. Das heisst die Namen der Ordner sollen in der JList stehen. Möglich?



Im FileChooser oder irgendwo anders im Programm? Mit File#listFiles bekommst du alle Dateien und Ordner in dem Verzeichnis.


----------



## JDE4D (29. Apr 2010)

The_S hat gesagt.:


> Im FileChooser oder irgendwo anders im Programm? Mit File#listFiles bekommst du alle Dateien und Ordner in dem Verzeichnis.



Ja stimmt, das hätte ich noch sagen sollen.

Ich habe eine GUI worauf ich eine JList habe(alles im Designer von Netbeans gemacht). Dort sollen die Ordner angezeigt werden..


----------



## The_S (29. Apr 2010)

Gut, aber hast du jetzt zur Lösung noch eine Frage?


----------



## JDE4D (29. Apr 2010)

erlichgesagt weiss ich nicht wo, wie und womit ich anfangen soll..

hast du vllt ein beispiel?


----------



## The_S (29. Apr 2010)

```
File[] dateienImVerzeichnis = deinFileChooser.getSelectedFile().listFiles();
```

Alles klar?


----------



## JDE4D (29. Apr 2010)

wie sag ich das er es in der JList anzeigt? Ich verstehe das noch nicht ganz.. ;(


----------



## The_S (29. Apr 2010)

Du läufst das Array dann in einer Schleife durch und fügst in dieser Schleife jedes File in dem Array deiner JList hinzu.


----------



## JDE4D (29. Apr 2010)

ich weiß grad nicht, wie ich das  in mein code umsetzte...


----------



## The_S (29. Apr 2010)

Du brauchst das File-Array an der selben Stelle, an der du auch Zugriff auf die Ziel-JList hast. Und dann gehts ab.


----------



## JDE4D (29. Apr 2010)

```
private void ChsDictActionPerformed(java.awt.event.ActionEvent evt) {                                        
        String filename = File.separator + "tmp";
        JFrame frame = null;
        JFileChooser fc = new JFileChooser(new File(filename));
        fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        int returnVal = fc.showOpenDialog(frame);
        File selFile = fc.getSelectedFile();

        String loctxt = selFile.getPath();
        File SubjDirs = new File(loctxt);
        String[] SubjDirsList = SubjDirs.list();
        JScrollPane listscr = new JScrollPane();
        DefaultListModel model = new DefaultListModel();

        if (returnVal == JFileChooser.APPROVE_OPTION) {
            CurrLoc.setText(loctxt);
 
            jList1.setModel(model);
            jList1.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
            jList1.setVisibleRowCount(-1);
            listscr.setPreferredSize(new Dimension(238, 168));

            for (String txtloc : SubjDirsList) {
                model.addElement(txtloc);

            }


            validate();
            repaint();

        }

    }
```

so klappts...

leider zeigt er alles an und nicht nur die ordner...


----------



## Murray (29. Apr 2010)

Arbeite statt mit File#list mit File#listFiles, dann bekommst du anstelle der Namen File-Objekte. Und daran gibt es die Methode isDirectory, die dir hier sicher hilft...


----------



## JDE4D (29. Apr 2010)

kannstdu mir etwas schreiben was in mein code passt? Bin noch ein java  anfänger und hab noch schwierigkeiten sachen anzuwenden <.<


----------



## Murray (29. Apr 2010)

```
File[] SubjDirsList = SubjDirs.listFiles(); /* !!! */
        JScrollPane listscr = new JScrollPane();
        DefaultListModel model = new DefaultListModel();
 
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            CurrLoc.setText(loctxt);
 
            jList1.setModel(model);
            jList1.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
            jList1.setVisibleRowCount(-1);
            listscr.setPreferredSize(new Dimension(238, 168));
 
            for (File txtloc : SubjDirsList) { /* !!! */
                if (txtloc.isDirectory()) model.addElement(txtloc.getName());  /* !!! */
 
            }
```


----------



## nixnick (30. Apr 2010)

für solche probleme hat sich bei mir anfangs eine ordentliche entwicklungsumgebung sehr bewährt.
programme wie netbeans oder eclipse zeigen dir auf knopfdruck alle methoden einer klasse und geben auch sofort daneben eine kurzbeschreibung an, dadurch findet man sehr schnell nötige funktionen.
außerdem werden tippfehler bereits beim tippen angezeigt oder korrigiert, so sieht man alle fehler auf einmal und muss nicht mühsam jeden einzelnen compilefehler durchgehen.


----------



## JDE4D (30. Apr 2010)

erstmal möchte ich Murray danken ! Alles perfekt.

Mich würde noch etwas interessieren:
1. Ich habe eine scrollbar hinzugefügt aber sie6 erscheint nicht, wenn zuviele in der liste sind.
2. Ist es möglich das wenn ich auf ein button klicke er mir eine .exe datei startet die im ausgewählten ordner(JList) sich befindet?

@nixnick: Ich use netbeans..


----------



## The_S (30. Apr 2010)

JDE4D hat gesagt.:


> 1. Ich habe eine scrollbar hinzugefügt aber sie6 erscheint nicht, wenn zuviele in der liste sind.



Du brauchst ein JScrollPane, welchem du die JList hinzufügst.



JDE4D hat gesagt.:


> 2. Ist es möglich das wenn ich auf ein button klicke er mir eine .exe datei startet die im ausgewählten ordner(JList) sich befindet?



Ja. Vor Java 6: Runtime.getRuntime().exec, ab Java 6 die Klasse Desktop.


----------



## JDE4D (30. Apr 2010)

ich danke euch allen!

werde mich jetzt an der runtime sache wagen..

werd mich melden, wenn ich wieder häng..


----------



## JDE4D (30. Apr 2010)

da bin ich wieder...

Ich glaube ihr müsst mir was erklären.

In meiner JList habe ich ja die models.. Diese sind ja ordner..

In meinem fall, existiert in jedem Model/Ordner EINE .exe datei.. 

Kann ich wenn ich in der liste mein ordner auswähle, die .exe starten die sich im ordner befindet?


----------



## The_S (30. Apr 2010)

ja


----------



## JDE4D (30. Apr 2010)

kannst du mir vllt den anfang vereinfachen?


----------



## The_S (30. Apr 2010)

Du holst dir das File oder den String (je nach dem wie du es in der JList speicherst) wieder aus der JList. Falls noch nicht geschehen, wandelst du das Objekt wieder in ein File-Objekt um, das auf den Ordner verweist. Mit File#listFiles kannst du wiederum alle Dateien in dem Ordner auslesen. Dort überprüfst du dann, welche Datei mit .exe endet und führst die dann über die Runtime aus.


----------



## JDE4D (30. Apr 2010)

soweit verstanden, aber brauch ich etwas wie getselected oder etwas ähnliches? Da es um das gerad ausgewähltes model handelt


----------



## BumBel (30. Apr 2010)

da sollte dir das weiterhelfen

```
list.getSelectedValue().toString()
```


----------



## The_S (30. Apr 2010)

BumBel hat gesagt.:


> da sollte dir das weiterhelfen
> 
> ```
> list.getSelectedValue().toString()
> ```



Wenn du das File allerdings direkt in die JList wirfst, reicht auch ein 


```
File f = (File)list.getSelectedValue();
```

Ansonsten müsstest du den File-String wieder in ein File umwandeln, was irgendwie schwachsinnig wäre ;-) .


----------



## JDE4D (30. Apr 2010)

```
Antwort         	
    private void StartclientButtActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
        String run = jList1.getSelectedValue().toString();
        File go2 = new File(run);
        File[] go = go2.listFiles();


        for (File txtloc : go) {
            if (txtloc.getName().endsWith(".exe")) {
                try {
                    Runtime.getRuntime().exec(run);
                } catch (IOException ex) {
                    Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
                }
            }

        }


    }
```

leider gibt er mir dort eine nullpointerexception...


----------



## The_S (30. Apr 2010)

1.) Wo kommt die NullPointerException?
2.) Warum übergibst du exec den Ordner?


----------



## JDE4D (30. Apr 2010)

1.) stimmt es muss txtloc rein, stimmts?
2.) die kommt im Try block.. Habe es mit 

```
´    private void StartclientButtActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
        String run = jList1.getSelectedValue().toString();
        File go2 = new File(run);
        File[] go = go2.listFiles();


        for (File txtloc : go) {
            if (txtloc.getName().endsWith(".exe")) {
                try {
                    Runtime.getRuntime().exec(txtloc.toString());  // Exception in thread 
                } catch (IOException ex) {
                    //Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
```

...versucht aber kommt wieder die exception..


----------



## The_S (30. Apr 2010)

Im catch-Block? Kann nicht sein! Da ist ja gar kein Code drin 

Und wie lautet die Fehlermeldung überhaupt genau?

Versuchs mal so


```
Runtime.getRuntime().exec("cmd /c " + txtloc.toString());
```


----------



## JDE4D (30. Apr 2010)

ich hab im try block gesagt... habe es mit dein vorschlag probiert, ohne erfolg.

das spuckt netbeans aus:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at sbotapp.NewJFrame.StartclientButtActionPerformed(NewJFrame.java:332)
        at sbotapp.NewJFrame.access$100(NewJFrame.java:32)
        at sbotapp.NewJFrame$2.actionPerformed(NewJFrame.java:100)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6263)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
        at java.awt.Component.processEvent(Component.java:6028)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4630)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
        at java.awt.Container.dispatchEventImpl(Container.java:2085)
        at java.awt.Window.dispatchEventImpl(Window.java:2478)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)


----------



## The_S (30. Apr 2010)

Ups, sorry, verlesen.

Und der Fehler verweist auch wirklich auf Runtime.getRuntime.exec()? Ich wüsste nicht, was hier null sein soll. Überprüfe doch mal, ob txtloc != null ist.


----------



## BumBel (30. Apr 2010)

Warum versuchst du das öffnen nicht mal damit:

```
if(Desktop.isDesktopSupported()){
   Desktop.getDesktop().open(file);
}
```


----------



## JDE4D (30. Apr 2010)

BumBel hat gesagt.:


> Warum versuchst du das öffnen nicht mal damit:
> 
> ```
> if(Desktop.isDesktopSupported()){
> ...



ansatt die for schleife? oder dadrinn?


----------



## JDE4D (30. Apr 2010)

```
private void StartclientButtActionPerformed(java.awt.event.ActionEvent evt) {                                                
        // TODO add your handling code here:
        String run = jList1.getSelectedValue().toString();
        File go2 = new File(run);
        File[] go = go2.listFiles();


        for (File txtloc : go) {
            if(Desktop.isDesktopSupported()){
                try {
                    Desktop.getDesktop().open(txtloc);
                } catch (IOException ex) {
                    Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            }

        


    }
```

klappt immer noch nicht.. immer noch die gleiche exception  

Ich verzweifle langsam..


----------



## Murray (30. Apr 2010)

Möglicherweise ist go null, weil go2 kein Directory ist. Das sieht man alles recht gut im Debugger; ersatzweise könntest du aber auch System.out.println()-Statements einfügen


```
private void StartclientButtActionPerformed(java.awt.event.ActionEvent evt) {                                                
        // TODO add your handling code here:
        String run = jList1.getSelectedValue().toString();
        System.out.println( "run=" + run);
        File go2 = new File(run);
        System.out.println( "go2=" + go2);
        System.out.println( "go2.AbsPath=" + go2.getAbsolutePath());
        System.out.println( "go2.Dir=" + go2.isDirectory);
        File[] go = go2.listFiles();
```


----------



## JDE4D (30. Apr 2010)

run=Cosma
go2=Cosma
go2.AbsPath=G:\Users\Sa\Documents\NetBeansProjects\SBotApp\Cosma
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
go2.Dir=false

Das hat er mir  rausgespuckt..


----------



## JDE4D (30. Apr 2010)

ich habe gedebuggt und alles durchgforst aber ich habe kein wert mit der .exe datei gefunden..


----------



## Murray (30. Apr 2010)

Die Reihen folge der Ausgaben ist seltsam, aber den entscheidenden Punkt sieht man ja: go2 ist kein Directory, daher liefert listFiles null. Wenn man dann in der for-Schleife über go iteriert, muss es knallen.


----------



## JDE4D (30. Apr 2010)

wo setzt ich das hin? 

```
String run = jList1.getSelectedValue().toString();
        System.out.println( "run=" + run);
        File go2 = new File(run);
        System.out.println( "go2=" + go2);
        System.out.println( "go2.AbsPath=" + go2.getAbsolutePath());
        System.out.println( "go2.Dir=" + go2.isDirectory());

        File[] go = go2.listFiles();


        for (File txtloc : go) {
            if (txtloc.getName().endsWith(".exe")) {
                try {
                    Runtime.getRuntime().exec("cmd /c " + txtloc.toString());
                } catch (IOException ex) {
                    //Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
                }
            }

        }
```


----------



## JDE4D (3. Mai 2010)

JDE4D hat gesagt.:


> wo setzt ich das hin?
> 
> ```
> String run = jList1.getSelectedValue().toString();
> ...


kann mir keiner helfen?


----------



## Murray (3. Mai 2010)

Was willst du irgendwo hinsetzen? Das Problem steckt doch offenbar im Befüllen der Liste, weil - wie schon beschrieben - der selektierte Eintrag kein Ordner ist, aber als solcher behandelt wird.

Was willst Du genau erreichen? Sollen in der JList jetzt Ordner oder Exen stehen?


----------



## JDE4D (3. Mai 2010)

Das willl ich:

Wenn ich auf den Button klicke, soll er im ausgewählten ordner (den ich in der JListe ausgewählt habe..) nach exe dateien suchen(im ordner is immer eine drin, aber mit immer anderen namen) und die dann starten...


----------



## Murray (3. Mai 2010)

Dann zeig doch bitte nochmal den aktuellen Code, mit dem die Liste befüllt wird.


----------



## JDE4D (3. Mai 2010)

hab das jetz  mit ein azubi so gelöst: 


```
private void StartclientButtActionPerformed(java.awt.event.ActionEvent evt) {                                                
        // TODO add your handling code here:
        String run = jList1.getSelectedValue().toString();
        String run2 = CurrLoc.getText();
        String slash = "\\";
        String runf = run2 + slash + run;
        System.out.println(run2 + "\\" +  run);
        File go2 = new File(runf);
        System.out.println( "go2=" + go2);
        System.out.println( "go2.AbsPath=" + go2.getAbsolutePath());
        System.out.println( "go2.Dir=" + go2.isDirectory());

        File[] go = go2.listFiles();


        for (File txtloc : go) {
            if (txtloc.getName().endsWith(".exe")) {
                try {
                    System.out.println(txtloc.toString());
                    Runtime.getRuntime().exec("cmd /c \"" + txtloc.toString() + "\"");
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }

        }


    }
```


----------



## The_S (10. Mai 2010)

Wo willst du was hinsetzen?

[edit] Ups, hab die zweite Seite übersehen. Einfach ignorieren


----------

