bestimmte dateiendungen in jtree rausfiltern

  • Themenstarter Gelöschtes Mitglied 35125
  • Beginndatum
G

Gelöschtes Mitglied 35125

Gast
hey leute nachdem sich mein erstes problem von alleine ;)) gelöst hat hab ich auch gleich das nächste. und zwar geht es diesmal um die filterung von bestimmten dateiendungen so dass nur diese im jtree angezeigt werden. hier mein code bis jetzt:

Code:
package dateibaum;

import java.io.File;
import java.io.FileFilter;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;

public class DateiBaum extends JFrame implements TreeSelectionListener
{
//Konstruktor
JTree baum;
    public DateiBaum(File file)
    {
        
        DefaultMutableTreeNode wurzel = new DefaultMutableTreeNode(file);
        baumAusgeben(file, wurzel);
        //Tree-Komponente erzeugen
        baum = new JTree(wurzel);
        baum.addTreeSelectionListener(this);
        //Ebene mit Scrollbalken zur Anzeige des JTree erzeugen
        JScrollPane treePane = new JScrollPane(baum);
        //diese der Inhalts-Ebene des JFrame hinzufügen
        this.getContentPane().add(treePane);

        //Fenster initialisieren
        this.setTitle("DateiBaum");
        this.setSize(500, 500);
        this.setLocation(200, 200);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }//Ende Konstruktor

    //Rekursive Methode zum Aufbau des Datenmodells für den JTree
    private void baumAusgeben(File file, DefaultMutableTreeNode ast)
    {
        DefaultMutableTreeNode blatt = new DefaultMutableTreeNode(file.getName());
        if (file.getName().endsWith(".jpg"))
        {
        
        ast.add(blatt);
        }
        if (file.isDirectory())
        {
            File verzeichnisInhalt[] = file.listFiles();
            if (verzeichnisInhalt != null)
                for (int i = 0; i < verzeichnisInhalt.length; i++)
                    baumAusgeben(verzeichnisInhalt[i], blatt);
        }
        
    }//Ende der Methode baumAusgeben

    //Methode des TreeSelectionListeners
    public void valueChanged(TreeSelectionEvent e)
    {
        Object[] geklickt = baum.getSelectionPath().getPath();
        int anzahl = geklickt.length;
        String text = "Geklickt auf: " + geklickt[anzahl - 1];
        for (int i = anzahl - 2; i >= 0; i--)
            text += "\n" + geklickt[i];
        JOptionPane.showMessageDialog(rootPane, text);
    }

    public static void main(String[] args)
    {
        DateiBaum dateiBaum = new DateiBaum(VerzeichnisAuswahl.getFile("Einlesen"));
        dateiBaum.setVisible(true);
    }
}

Code:
package dateibaum;

import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;
import konstanten.Konstanten;

/**
 * Die Klasse Dateiauswahl stellt ein Dialog zur Auswahl eines
 * root-Verzeichnisses zur Verfügung.
 * 
 */
public class VerzeichnisAuswahl implements Konstanten
{
    

    public static File getFile(String titel)
    {
        //Dialog zum Auswählen des Root-Verzeichnisses
        JFileChooser fc = new JFileChooser(titel);
        //nur Verzeichnisse anzeigen lassen
        fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        fc.setAcceptAllFileFilterUsed(false);
        //Extensions-Array auf Auswahl-Dialog anwenden
        //FileNameExtensionFilter filter_all = new FileNameExtensionFilter("alle Bild Dateien", Konstanten.extensions);
        //FileNameExtensionFilter filter_gif = new FileNameExtensionFilter("gif-Dateien", "gif");
        //FileNameExtensionFilter filter_jpeg = new FileNameExtensionFilter("jpeg-Dateien", "jpeg");
        //fc.setFileFilter(filter_all);
        //fc.setFileFilter(filter_gif);
        //fc.setFileFilter(filter_jpeg);
        fc.setDialogTitle("Root-Verzeichnis auswählen");
        int antw = fc.showDialog(null, titel);
        //falls auf Abbrechen geklickt
        if (antw == JFileChooser.CANCEL_OPTION)
        {
            return null;
        }
        return fc.getSelectedFile();
    }
}

alles klappt, nur wenn der jtree ausgegeben wird dann sehe ich keine dateien, nur das root verzeichnis das ich vorher ausgewählt habe. wenn ihr mir noch ein tipp geben könntet wie ich nur die dateiendungen rausfiltern lassen könnte die ich vorher in ein array gepackt habe wäre das perfekt.

hier das interface dass die konstanten enthält:

Code:
package konstanten;

/**
 * Das Interface Konstanten stellt Konstanten für die Anwendung bereit.
 * 
 */
public interface Konstanten
{
    //Dateiendungen in Array packen
    final String extensions[] = {"jpeg", "gif", "bmp"};
}
 
S

SlaterB

Gast
JAVA-Tags wären weitaus lesbarer,

schau dir deine baumAusgeben()-Methode genau an, prüfe doch Schritt für Schritt was passiert, was verknüpft wird,
statt unbekannte Nodes zu verknüpfen, wo 10 andere Fehler noch Ursache für falsche Anzeige sein können,
bietet sich bei jeden Algorithmus der Welt erstmal an, das ganze auf Papier durchzugehen/ im Code Ausgaben a la 'hänge nun X an Y an' usw.,

das einzige add() in der ganzen Methode steht bei jpg-Blättern,
wie soll bei 5 Verzeichnissen ineinander, offensichtlich ohne jpg, irgendwas aufgebaut werden?
 
G

Gelöschtes Mitglied 35125

Gast
danke für die antwort. also ich muss sagen rekursion und JTree sind mir relativ neu und ich hab da nur nen groben durchblick, meine dozentin hat mir halt einen beispiel code gegeben den ich nur ein wenig angepasst habe. ich habe mir ein testverzeichnis angelegt wo nur jpg und txt dateien drinne sind, also müsste das doch klappen oder? ich habe vor den filter später noch zu erweitern, ich will ja lediglich 3-4 grafikdateiendungen rausfiltern, mehr nicht.

sorry aber ich kenne mich da wirklich noch nicht so aus mit rekursion deswegen kann ich das noch nicht nachvollziehen was da passiert....
 
S

SlaterB

Gast
wie gesagt kannst du JTree vorerst weglassen und einfach nur mit System.out.println() arbeiten

dass du nachvollziehst was da passiert, ist nicht ungewöhnlich, aber als letzter Stand nicht akzeptabel,
gerade deswegen musst du es nun selber verstehen, Schritt für Schritt durchgehen,

schau dir deine Festplatte an, leg evtl. extra paar Verzeichnisse mit günstigen Namen an,
Root
- A1
- A2
- A3
---B1
---B2
---B3
oder ähnliches


die ganze Rekursion musst du nicht mit einem Schlag erfassen, schaue dir nach und nach an, was passiert,
was wird vor dem ersten Aufruf schon alles gemacht, welche Knoten vielleicht angelegt?

was passiert exakt im ersten Aufruf der Methode? was sind die Parameter, welches File wird übergeben, welcher TreeNode, für welches Verzeichnis steht der?
was wird neu angelegt und womit verknüpft durch welchen Befehl? usw.
/ parallel abweichend davon vielleicht darstellen, was der Theorie nach passieren sollte,
aber wenn du dabei schon Unterschiede erkennst, ist das Ziel ja quasi erreicht

wenn du selbst davon nicht alles beantworten kannst, ist das kein Beinbruch,
aber versuche soviel wie möglich durch deine Worte zu erarbeiten,
stelle vielleicht intelligente Fragen wo du ausdrücken kannst was dir unverständlich ist,

dann ist der Rest einfacher zu ergänzen als nur bei 'ich nix wissen'..

--

> ich habe mir ein testverzeichnis angelegt wo nur jpg und txt dateien drinne sind, also müsste das doch klappen oder?
mag sein, kannst du ja testen, ich denke gerade vor allem an Unterverzeichnisse,
nur mit Bildern ist nicht so viel Rekursion da, hauptsächlich die eine Schleife, wobei immer noch manches schiefgehen kann
 
Zuletzt bearbeitet von einem Moderator:
G

Gelöschtes Mitglied 35125

Gast
die aufbauweise vom jtree hab ich soweit verstanden, nur wirds kompliziert wenn man mittels rekursion da was erreichen will, jedenfalls für meine temporären verhältnisse:D

naja bin den code nochmal mit meiner dozentin durchgegangen, nach ner 30 minütigen diskussion haben wir das problem soweit behoben. hier die neue baumAusgeben() methode:

Code:
private void baumAusgeben(File file, DefaultMutableTreeNode ast)
    {
        DefaultMutableTreeNode blatt =  new DefaultMutableTreeNode(file.getPath());
        ast.add(blatt);
        if (file.isDirectory())
        {
            File verzeichnisInhalt[] = file.listFiles();
            if (verzeichnisInhalt != null)
            {
                for (int i = 0; i < verzeichnisInhalt.length; i++)
                {
                    if ( verzeichnisInhalt[i].isDirectory() )
                            if (verzeichnisInhalt[i].listFiles().length > 0)
                                baumAusgeben(verzeichnisInhalt[i], blatt);
                   if (verzeichnisInhalt[i].isFile() && verzeichnisInhalt[i].getPath().endsWith("jpg"))
                             baumAusgeben(verzeichnisInhalt[i], blatt);
                }
            }
        }

problem ist, das programm zeigt zwar jetzt nur jpg-dateien an, aber es zeigt leere verzeichnisse (oder verzeichnisse wo es keine jpg-dateien findet) als leaf an, was bei vielen ordnern schnell für verwirrung sorgen kann. hab mir überlegt meinem programm eine baumPruefen methode hinzuzufügen die dann bei der ausgabe die leeren verzeichnisse rausfiltert. nur den inhalt der methode muss ich mir noch ausdenken;)
 
S

SlaterB

Gast
alternativ kannst du etwas andersrum vorgehen:
wenn kein directory, dann adden und gut ist, ein frühes return schadet auch nicht,
dann muss der Rest nicht mit if eingerückt werden

für directory erst die Schleife, und wenn am Ende nix drin ist im Node (kein Childs), dann den aktuellen Node selber auch nicht nach oben adden(),
gehe das gedanklich durch oder teste es einfach

-------

file.listFiles() liefert übrigens beliebige Dateien in einem Verzeichnis, da wird nicht gefiltert,
mit FileChooser hat das nichts zu tun, du musst hier auf die Endung schauen, falls wichtig

gibt erfreulicherweise auch Methoden listFiles(FileFilter filter)/ listFiles(FilenameFilter),
nicht vergessen auch Directorys zu erlauben
 
Zuletzt bearbeitet von einem Moderator:
G

Gelöschtes Mitglied 35125

Gast
danke für die tipps, habs jetzt hinbekommen, ich habe aber da noch ein letztes problemchen:D

und zwar wenn man mittels

Code:
private void btnOeffnenActionPerformed(java.awt.event.ActionEvent evt)                                           
    {                                               
        DateiBaum baum = new DateiBaum(DateiAuswahl.getDirectory("Einlesen"));
        this.jTreeBaum.setModel(DateiBaum.baum.getModel());
        
    }

ein neues verzeichnis auswählen will, dann wird automatisch die methode

Code:
public void valueChanged(TreeSelectionEvent e)
    {
        GUIBildbetrachter bilderrahmen = new GUIBildbetrachter(e.getPath().getLastPathComponent().toString());
       
    }

aufgerufen die wiederrum ein neues bildbetrachter-objekt erzeugt. dies passiert jedesmal wenn ich ein neues verzeichnis auswählen will, was aber nicht so sein soll. gibt es da einen weg das zu unterdrücken? ich brauche die 2. methode um grafik-dateien in separaten jframes anzeigen zu lassen wenn diese im jframe dass den jtree enthält ausgewählt werden.
 
S

SlaterB

Gast
die einfache Variante wäre, vor und nach dem setModel-Aufruf einen boolean zu setzen, so dass der Listener solange nichts macht
(der muss dann den boolean prüfen), bzw. den Listener solange entfernen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Alle Zahlen finden, die 3 bestimmte Ziffern enthalten? Java Basics - Anfänger-Themen 9
S Bestimmte werte aus einem Array löschen Java Basics - Anfänger-Themen 2
K loop pausieren für eine bestimmte Anzahl? Java Basics - Anfänger-Themen 1
Cassy3 Binäre Bäume Rekursiv durchlaufen und bestimmte Elemente Zählen Java Basics - Anfänger-Themen 6
Schniffi Nur bestimmte Bilder aus einem Array auf Image Button anzeigen lassen Java Basics - Anfänger-Themen 3
W Bestimmte Zahlen bei Math.random ausschließen? Java Basics - Anfänger-Themen 31
J Bestimmte parameter aus Jsonfile auslesen Java Basics - Anfänger-Themen 15
HighLife Bestimmte Werte aus Array zählen Java Basics - Anfänger-Themen 15
T Bestimmte Zahlen ausgeben mit einer whilfe Schleife Java Basics - Anfänger-Themen 21
M Wie kann ich bei int-Variablen im exception handler auf bestimmte Strings reagieren? Java Basics - Anfänger-Themen 5
B Neue Liste erstellen, wenn Objekte bestimmte Referenz hat / Gruppierung von Einträgen Java Basics - Anfänger-Themen 12
B Nur eine bestimmte Anzahl an Arrays ausgeben Java Basics - Anfänger-Themen 9
M Regex für bestimmte Wörter bzw. bestimmte Zeichen erstellen Java Basics - Anfänger-Themen 5
B Von Array nur eine bestimmte Anzahl bekommen Java Basics - Anfänger-Themen 3
J Datei auslesen (nur bestimmte Stellen) Java Basics - Anfänger-Themen 2
L Nur Bestimmte Werte aus einem Array in ein anderes Speichern Java Basics - Anfänger-Themen 11
B Denkanstoß benötigt: Emails an bestimmte Emailadresse schicken Java Basics - Anfänger-Themen 6
U Mehrfacheingabe auf bestimmte Parameter prüfen Java Basics - Anfänger-Themen 8
L String auf bestimmte zeichen untersuchen Java Basics - Anfänger-Themen 9
L Bestimmte Werte eines Arrays ausgeben. Java Basics - Anfänger-Themen 3
P Input/Output Bestimmte Anzahl von Werten in einem Array an Methode übergeben Java Basics - Anfänger-Themen 2
Henri Bestimmte Werte eine XML-Datei ausgeben. Java Basics - Anfänger-Themen 8
M ComboBox bestimmte Elemente disablen/ausgrauen Java Basics - Anfänger-Themen 3
S JButton soll für bestimmte Zeit verschwinden Java Basics - Anfänger-Themen 5
E Datei einlesen und bestimmte Wörter ausgeben Java Basics - Anfänger-Themen 2
A Threads Threads bestimmte Aufgaben zuweisen... Java Basics - Anfänger-Themen 3
D Input/Output Buchstaben als bestimmte Zahl erkennen Java Basics - Anfänger-Themen 4
S Welche Datenstruktur ist die optimalste um Funktionen fuer bestimmte Wertebereiche abzurufen..? Java Basics - Anfänger-Themen 5
N Bestimmte Zeichen eines Strings umwandeln Java Basics - Anfänger-Themen 4
K Eine bestimmte Zeit, eine Schleife laufen lassen. Java Basics - Anfänger-Themen 4
A CSV datei eine Bestimmte Zeile ansprechen Java Basics - Anfänger-Themen 1
W char-Array auf bestimmte Zeichen prüfen Java Basics - Anfänger-Themen 10
C Array kopieren und nur bestimmte Werte speichern Java Basics - Anfänger-Themen 6
D Bestimmte Werte von Objekten aus einer ArrayList in eine andere ArrayList kopieren Java Basics - Anfänger-Themen 14
N Bestimmte Inhalte aus Datei lesen Java Basics - Anfänger-Themen 11
Ananaskirsche Input/Output Bestimmte Zeile aus Datei einlesen Java Basics - Anfänger-Themen 4
B Best Practice Bestimmte Zahl auslesen und in Variable speichern Java Basics - Anfänger-Themen 3
N Bestimmte Zeile aus einer Datei auslesen Java Basics - Anfänger-Themen 10
I Int Array, Zahl an bestimmte position setzten Java Basics - Anfänger-Themen 2
C [Bukkit Plugin] Blöcke eine bestimmte route entlang fliegen Java Basics - Anfänger-Themen 3
A Button in eine bestimmte Spalte platzieren Java Basics - Anfänger-Themen 4
D Bestimmte Zeile aus TXT Datei ausgeben Java Basics - Anfänger-Themen 4
A Eine Datei Lesen und bestimmte Position überschreiben Java Basics - Anfänger-Themen 2
M Bestimmte Zeichen auslesen Java Basics - Anfänger-Themen 2
W bestimmte Objekte in ArrayList auslesen Java Basics - Anfänger-Themen 8
G JTextArea: nur bestimmte Zeilen anders formatieren Java Basics - Anfänger-Themen 7
B Input/Output bestimmte Zeilen in .txt Dateinen überschreiben Java Basics - Anfänger-Themen 20
J Bestimmte Anzahl Zeichen aneinander fügen Java Basics - Anfänger-Themen 9
C Bestimmte Informationen von Webseite suchen Java Basics - Anfänger-Themen 13
B Nur bestimmte Klasse ausführen Java Basics - Anfänger-Themen 6
Kenan89 Bestimmte Zeile in txt-Datei ersetzen Java Basics - Anfänger-Themen 4
D BufferedInputStream nur bestimmte Zeichen Java Basics - Anfänger-Themen 11
D Input/Output bestimmte Zeile auslesen Java Basics - Anfänger-Themen 3
B Bestimmte Ziffer Java Basics - Anfänger-Themen 27
B Input/Output In Datei an eine bestimmte Stelle schreiben Java Basics - Anfänger-Themen 37
S Bestimmte Objekte aus Collections anwählen/herausbekommen Java Basics - Anfänger-Themen 8
I Bestimmte Objekte einer Liste hinzufügen Java Basics - Anfänger-Themen 16
R Bestimmte Stellen eines BigInteger Java Basics - Anfänger-Themen 7
S Collections Aus Set<Object> bestimmte Typen entfernen Java Basics - Anfänger-Themen 3
S Bestimmte Methode von unbestimmter Datei Java Basics - Anfänger-Themen 6
V Bestimmte Stellen aus .txt Datei auslesen Java Basics - Anfänger-Themen 11
B bestimmte klammern im string ersetzten Java Basics - Anfänger-Themen 17
Binary.Coder JTable bzw. Tabelle in bestimmte Form überführen Java Basics - Anfänger-Themen 5
B Bestimmte Werte aus einem String entnehmen Java Basics - Anfänger-Themen 3
0 Grafik eine bestimmte Strecke laufen lassen Java Basics - Anfänger-Themen 6
X im Verzeichnissbaum recursiv nur bestimmte Dateien finden Java Basics - Anfänger-Themen 7
M Aus String bestimmte Inhalte auslesen Java Basics - Anfänger-Themen 8
M Reaktion auf bestimmte Zeit Java Basics - Anfänger-Themen 2
2 Bestimmte Anzahl von Bytes lesen und als string ausgeben? Java Basics - Anfänger-Themen 3
N Bestimmte Zeichen aus Strings zählen Java Basics - Anfänger-Themen 11
P Bestimmte Zeilen einer Datei ermitteln ? Java Basics - Anfänger-Themen 30
StrikeTom Bestimmte stelle in string herausfiltern Java Basics - Anfänger-Themen 7
M Float auf bestimmte Nachkommazahl runden Java Basics - Anfänger-Themen 3
E Bild eine bestimmte Anzahl blinken lassen Java Basics - Anfänger-Themen 3
B array bestimmte summe berechnen Java Basics - Anfänger-Themen 4
Luk10 Zufallszahl "ohne" eine bestimmte Zahl(en) Java Basics - Anfänger-Themen 8
S OOP Wie bei Spiel "17+4" eine Karte an bestimmte Position hinzufügen Java Basics - Anfänger-Themen 13
B OOP String auf bestimmte Zeichen abfragen Java Basics - Anfänger-Themen 4
S Bestimmte Elemente einer ArrayList löschen Java Basics - Anfänger-Themen 3
S Double bis bestimmte Nachkommzahl vergleichen (ohne zusätzliche Libs) Java Basics - Anfänger-Themen 12
Ollek Bestimmte Zeilen aus einer HTML Datei lesen Java Basics - Anfänger-Themen 8
N Text an bestimmte Stelle eines Dokuments schreiben Java Basics - Anfänger-Themen 6
G Bestimmte Zeile aus CSV ausgeben Java Basics - Anfänger-Themen 14
Assassin Nur bestimmte Daten aus txt auslesen... Java Basics - Anfänger-Themen 12
Developer_X Durch int Bestimmte Zeile überschreiben Java Basics - Anfänger-Themen 16
Developer_X Bestimmte Zeile aus TextDocument lesen Java Basics - Anfänger-Themen 2
V Nur bestimmte Werte zulassen Java Basics - Anfänger-Themen 2
M Bestimmte zeile aus .txt einlesen Java Basics - Anfänger-Themen 6
Q Nach Stringvorgabe bestimmte funktionen ausführen Java Basics - Anfänger-Themen 3
G Bestimmte Ebene eines Baumes rekursiv ausgeben Java Basics - Anfänger-Themen 49
I bestimmte Zahlen markieren.helppp. Java Basics - Anfänger-Themen 17
G Bestimmte Position im array auslesen Java Basics - Anfänger-Themen 8
H bestimmte objekte in ArrayList löschen? Java Basics - Anfänger-Themen 7
P Hilfe für JComboBox, bmp einbinden/bestimmte punkte auf bmp Java Basics - Anfänger-Themen 3
M bestimmte Zeichen in String eliminieren Java Basics - Anfänger-Themen 2
T Bestimmte Zeile aus einer .txt-Datei auslesen? Java Basics - Anfänger-Themen 10
S Bestimmte Anzahl an nummern auslesen Java Basics - Anfänger-Themen 4
K bestimmte Dateien aus Ordner verschieben Java Basics - Anfänger-Themen 5
F Bestimmte Werte nicht beachten Java Basics - Anfänger-Themen 10
G bestimmte Stelle aus Textdatei auslesen. Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben