JTree mit Dateifilter

Hallo und guten Morgen!

Ich bin ein Neuling, nicht in der Programmiersprache Java, aber hier im Forum. Das Forum das ich zuvor nutzte um es mit meinen Problemen zu füllen wurde von einer Sekunde zur nächsten geschlossen, daher habe ich den Weg in diese Community eingeschlagen. Ich hoffe das ich bei Euch genauso gut Hilfe bekomme wie anders wo.

Und schon komme ich zu meinem ersten Problem:

Ich habe mir einen JTree erstellt der den Inhalt des aktuellen Arbeitsverzeichnisses anzeigt. Da nur bestimmte Dateien angezeigt werden sollen habe ich noch einen Dateifilter eingebaut der Dateien an Hand von Dateiendungen filtert.

Der JTree läuft so wie ich es mir vorgestellt habe, allerdings schreit mich der Kompiler beim kompilieren mit zwei Warnungen an.

Note: ownJTree.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

Ich habe mich im Netz über die Warnungen schlau gemacht und auch was gefunden was vielversprechend war, allerdings konnte ich die Warnungen nicht beseitigen.

In Zeile 50 verwende ich „Vector“ und ich vermute das es damit was zu tun hat, ich habe dem Vector über die Eingabe „new Vector()“ mitgeteilt das dieser nur Objekte der Klasse „ownDefaultMutableTreeNode“ aufnehmen soll. Aber das hat nichts gebracht.

Vielleicht kann mir jemand weiterhelfen, hier mal mein Code.

import java.awt.*;
import java.io.File;
import java.io.FileFilter;
import java.util.Vector;

import javax.swing.*;
import javax.swing.JScrollPane;
import javax.swing.tree.TreeModel;
import javax.swing.tree.DefaultMutableTreeNode;

public class ownJTree extends JFrame
{
    public static void main(String [] arg)
    {
        new ownJTree().setVisible(true);
    }
    
    public ownJTree()
    {
        super("JTree Beispiel");
        this.setLocationRelativeTo(null);
        this.setSize(new Dimension(300,300));
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JTree tree = new JTree( new ownDefaultMutableTreeNode(
                                new File(System.getProperty("user.dir")))
                               );

        this.add(new JScrollPane(tree), BorderLayout.CENTER);
    }
}

class ownDefaultMutableTreeNode extends DefaultMutableTreeNode
{
    private File file;
    
    public ownDefaultMutableTreeNode(File f)
    {
        setfile(f);
        setChildren(f);
    }
    private void setfile(File f)
    {
        file = f;
    }
    private void setChildren(File F)
    {
        if(file.listFiles() != null)
        {
            children = new Vector();
            for(File f : file.listFiles(new ownFileExtensionFilter()))
            {
                children.add(new ownDefaultMutableTreeNode(f));
            }
        }
    }
    private String getName()
    {
        return file.getName();
    }
    public boolean isLeaf()
    {
        return !file.isDirectory();
    }
    @Override
    public String toString()
    {
        return getName();
    }
}

class ownFileExtensionFilter implements FileFilter
{
    private String[] extList = {"java","c","cpp","cxx","h","bat","sh"};
    
    public boolean accept( File f )
    {
        return f.isDirectory() || compareExtension(f);
    }

    private boolean compareExtension(File f)
    {
        char[] filename = f.getName().toCharArray();
        String tempString = "";
        int i = filename.length-1;

        while(filename** != '.')
        {
            if(i == 0) break;
            tempString = tempString + filename**;
            i--;
        }
        String extension = new StringBuffer(tempString).reverse().toString();

        for(int j = 0; j < extList.length; j++)
        {
            if(extension.equals(extList[j])) return true;
        }

        return false;
    }
}

Solltet Ihr noch Verbesserungsvorschläge für meine Klassen oder dem Code allgemein haben, dann immer raus damit. :smiley:

Müßte gerade selbst mal testen, ob man da drumrumkommt, aber ein erster Schritt könnte sein, den ‘children’ Vector nicht selbst zu erstellen und zu verwalten, sondern die Child-Knoten einfach mit
add(new ownDefaultMutableTreeNode(f));
hinzuzufügen. Ggf. auch mal die Ausgabe posten, die kommt, wenn du es mit -Xlint:unchecked compilierst

wenn du es mit -Xlint:unchecked compilierst

Ich wusste das es mich einholt, dachte nur nicht so schnell, ich habe dazu nichts im Netz gefunden und weiß nicht so Recht was ich damit anfangen soll. Ist das ein bestimmtes Flag was beim Kompilieren gesetzt werden muss?

ja, das muß beim compilieren gesetzt werden

javac -Xlint:unchecked ownJTree.java

Die Ausgabe dazu lautet dann:

ownJTree.java:53: warning: [unchecked] unchecked call to add(E) as a member of the raw type Vector
                    children.add(new ownDefaultMutableTreeNode(f));
                                ^
  where E is a type-variable:
    E extends Object declared in class Vector
1 warning

Wenn du allerdings nichts dran ändern kannst, was hier der Fall ist. children müsstest du selbst deklarieren und dann Generics nutzen. Die Warnung kannst du allerdings auch unterdrücken indem du vor den Beginn der Methode die die unsichere Operation macht folgendes schreibst.

@SuppressWarnings("unchecked")
private void setChildren(File F){
   ...
  children.add(new oDMTN(f));
  ...
}

Die Warnung sagt, dass du was unsicheres versuchst. Die Annotation @SuppressWarnings, dass du weißt was du machst und dir sicher bist, dass hier nichts schief läuft.
Danach kannst du dann ganz normal compilieren, ohne Warnungen zu erhalten.

Es ist garnicht notwendig, dass du auf “children” zugreiffst: DefaultMutableTreeNode bietet schon die Methode “add(MutableTreeNode)” an. Die ist typsicher, und die schreibt schlussendlich auch nur in “children”.

Zunächst einmal vielen Dank für die schnelle Hilfe…

Das Problem konnte ich zwischenzeitig beheben, ich habe den Zugriff auf “children” rausgeschmissen und direkt die Methode add(MutableTreeNode) verwendet. Also so wie Beni schon sagte.

Eine Frage habe ich den noch, aus bekannten Datei Explorern kennt man ja dass, wenn man auf eine weiße Stelle klickt, die Selektierung aufgehoben wird. Wie wird denn sowas realisiert?
Wird auf das jeweilige Panel ein Maus-Event ausgeführt und in dessen Verarbeitung die Selektierung aufgehoben. Also im Fall von JTree, clearSelection().

[QUOTE=t_2;20697]Eine Frage habe ich den noch, aus bekannten Datei Explorern kennt man ja dass, wenn man auf eine weiße Stelle klickt, die Selektierung aufgehoben wird. Wie wird denn sowas realisiert?
Wird auf das jeweilige Panel ein Maus-Event ausgeführt und in dessen Verarbeitung die Selektierung aufgehoben. Also im Fall von JTree, clearSelection().[/QUOTE]
Ich kenne das Verhalten so nicht, im File Tree existiert immer eine Selektion, nur in der Liste/Tabelle können Selektionen aufgehoben werden.
Aber wenn Du das vür den JTree implementieren willst, einfach einen MouseListener an den JTree und wenn kein gültiger Pfad angeklickt wurde, die Selektion löschen.

Du hast recht, das geht tatsächlich nicht. :smiley:
Ich habe mich da wohl etwas irritieren lassen…