AWT JFileChooser bestimmte Ordner anzeigen

Meeresgott

Bekanntes Mitglied
Hallo liebes Forum,
ich habe ein Programm geschrieben, dass in einen vom User bestimmten Ordner verschieden Dateien ablegt. Aktuell muss der User in diesen Ordner rein navigieren und dann dort eine bestimmt Datei auswählen, damit das Programm diesen Ordner als Projekt erkennt.

Ich möchte das nun so ändern, dass der User statt der Datei nun den ganzen Ordner auswählen kann, allerdings sollen nur die Ordner ausgewählt werden, die diese bestimmt Datei enthalten.
Alle anderen Ordner sollen als ganz normale Order gesehen werden.

Falls ich es ein wenig umständlich erklärt habe: Wie bei Netbeans wenn man ein Projekt öffnen möchte. Dort werden nur Netbeans-Projekte erkannt die welche sind und dem entsprechend anderes visualisiert.

Ich hoffe ihr könnt mir helfen!

viele Grüße,
Meeresgott
 

Meeresgott

Bekanntes Mitglied
Guten Abend,

der Code den ich bisher habe ist sehr simple:
Java:
JFileChooser fileChooser = new JFileChooser(new File("").getAbsoluteFile());
fileChooser.setAcceptAllFileFilterUsed(false);
FileNameExtensionFilter filter = new FileNameExtensionFilter("Datenbank (.mv.db)", "db");
fileChooser.setFileFilter(filter);
fileChooser.showOpenDialog();

@thet1983 ich habe leider keine Funktion finden können, die Prüft, ob eine Datei in diesem Ordner ist und diesen dann als Projekt/wählbaren Order akzeptiert. FileNameExtensionFilter ist soweit ich es weiß nur für Dateien gut die eine Spezielle Endung haben. Ich möchte einen Ordner selektieren der eine bestimmte Datei beinhaltet.

viele grüße,
Meeresgott
 

thet1983

Top Contributor
also so wie ich das verstanden habe wählst du in deinem programm ein projekt und der user darf wenn er für dieses projekt etwas anlegt nur in den für das projekt vorgesehenen ordner schreiben oder?
 

Harry Kane

Top Contributor
Ich brauchte mal eine Funktion, die auf das mögliche überschreiben von Dateien hinweist, und zwar nicht erst, nachdem der Benutzer eine Datei ausgewählt hat und der Speichern-Dialog wieder geschlossen war, sondern während der Auswahl.
Dazu habe ich JFileChooser erweitert und die approveSelection-Methode überschrieben. Das müsste in deinem Fall auch funktionieren.
Code:
public class OverwriteProtectedFileChooser extends JFileChooser {

    public OverwriteProtectedFileChooser(File file) {
        super(file);
    }

   
    @Override
    public void approveSelection() {
        File selected = getSelectedFile();
        if(selected.isDirectory()){
            super.approveSelection();//in super.approveSelection() wird dann überprüft, ob der Typ der ausgewählten Files zum FileSelectionMode passt (Files, Directories, Both)
            return;
        }
        if (getDialogType() == JFileChooser.SAVE_DIALOG && getSelectedFile() != null && getSelectedFile().exists()) {
            int value = JOptionPane.showConfirmDialog(this, "Warning! The file \n\r" + getSelectedFile().getPath() + "\n\r already exists! Overwrite it?", "Warning", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
            if (value == JOptionPane.NO_OPTION) {
                return;
            }
        }
        if (getDialogType() == JFileChooser.OPEN_DIALOG) {
           if(selected.isDirectory()){
               //check ob Datei vorhanden, falls nein: return (= nix machen)
               return;
           }
        }
        super.approveSelection();
    }
}
 

Meeresgott

Bekanntes Mitglied
habe mir jetzt aus deinem Code eine kleine Test-Klasse zusammen geschustert.
Code:
public class JFileChooserTest
{

    public static void main(String[] args)
    {
        new JFileChooserTest().los();
    }

    public void los()
    {
        JFileChooser f = new OverwriteProtectedFileChooser(new File(""),"test.txt");
        f.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        int showOpenDialog = f.showOpenDialog(null);
       
        if (showOpenDialog == JFileChooser.APPROVE_OPTION)
            System.out.println("Selected File: "+f.getSelectedFile().getAbsolutePath());
    }
   
    class OverwriteProtectedFileChooser extends JFileChooser {

        private String file;
       
        public OverwriteProtectedFileChooser(File file,String index)
        {
            super(file);
            this.file = index;
        }

        @Override
        public void approveSelection() {
            File selected = getSelectedFile();

            if (getDialogType() == JFileChooser.SAVE_DIALOG
                    && getSelectedFile() != null
                    && getSelectedFile().exists())
            {
                int value = JOptionPane.showConfirmDialog(this,
                        "Warning! The file \n\r" + getSelectedFile().getPath()
                                + "\n\r already exists! Overwrite it?",
                        "Warning",
                        JOptionPane.YES_NO_OPTION,
                        JOptionPane.WARNING_MESSAGE
                );
               
                if (value == JOptionPane.NO_OPTION)
                {
                    return;
                }
            }
            if (getDialogType() == JFileChooser.OPEN_DIALOG)
            {
                if (selected.isDirectory())
                {
                    if(!new File(selected.getAbsolutePath()+"//"+file).exists())
                    {
                        return;
                    }
                }
            }
            super.approveSelection();
        }
    }
}

Und ich muss sagen, dass es genau die Funktion die ich haben möchte!
Allerdings hätte ich noch gerne Zwei Einschränkungen:
Einmal kann der User noch in den Ordner wo meine "test.txt" liegt navigieren. Das will ich noch irgenwie unterbunden haben allerdings fehlt mir auch hier der Ansatz.
Welche Methode müsste ich dafür Überschreiben?
Und ich möchte, dass ein Doppelklick auf einen mit der "test.txt" versehenden Ordner ausreicht um diesen zu Selektieren. Zurzeit geht man dann in diesen Ordner rein.
Auch hier bin ich wieder Ratlos welche Methode ich Überschreiben soll :/

und falls möglich aus Sahnehäubchen wurde ich gerne Den Ordner mit der eine "test.txt" enthält mit einem anderen Anzeige-Icon versehen. Trägt logischer weise nichts zur Funktion bei allerdings sind Projekte so besser zu finden und es sieht so meine Meinung einfach schöner aus ;)

Schon mal echt vielen Dank! Hatte schon überlegt einen eigenen FileChooser zu schreiben. Echt merkwürdig, dass ich nicht drauf kam ein Child von JFileChooser zu schreiben. :eek:
 

Harry Kane

Top Contributor
Einmal kann der User noch in den Ordner wo meine "test.txt" liegt navigieren. Das will ich noch irgenwie unterbunden haben allerdings fehlt mir auch hier der Ansatz.
Welche Methode müsste ich dafür Überschreiben?
JFileChooser.isTraversable(File f) müsste das sein, was du suchst.
Für das Icon müsstest du wahrscheinlich eine Erweiterung von javax.swing.filechooser.FileSystemView schreiben. Das habe ich aber noch nie gemacht. google weiss aber sicher Rat.
 

Meeresgott

Bekanntes Mitglied
FileChooser.isTraversable(File f)
Leider nicht. Ich habe folgenden Code hinzugefügt.
Java:
@Override
        public boolean isTraversable(File f) {
            if (f != null) {
                if (new File(f.getAbsolutePath() + "//" + file).exists()) {
                    return false;
                }
            }
            return super.isTraversable(f);
           
        }
Vorher Stand ein true da ich wollte schauen was passiert wenn ich dieses auf false setzte.
Das Ergebnis ist, dass der Ordner mit der Datei nicht mehr angezeigt wird. Und leider nich wie gewünscht das der FileChooser diesen als Pfad an nimmt.

LG
 

Harry Kane

Top Contributor
Das wäre im Widerspruch zur API Dokumentation von JFileChooser: Returns true if the file (directory) can be visited.
Ich probiere mal am WE ein bisschen rum.
 

Meeresgott

Bekanntes Mitglied
Returns true if the file (directory) can be visited.

Würde für mich Sinn ergeben. Liefert wahr zurück, wenn die Datei/der Ordner besichtigt/aufgesucht werden kann. Heißt ja nichts anderes, als das ein falsch bedeutet, dass der Ordner nicht aufgesucht werden darf und somit nicht angezeigt wird im FileChooser.

Scheint mir so als wäre es doch die falsche Methode :/

Habe aber bisher leider keine andere gefunden in der API die sagt, Liefert wahr zurück wenn es ein File ist. Oder muss ich einen eigenen FileFilter schreiben, der schaut, ob der Ordner angenommen wird oder nicht?

LG
 

Neumi5694

Top Contributor
Wie wär's, wenn du das Ereignis abfängst, mit dem der User in das Verzeichnis geht? Ich nehme an, dass bei Doppelklick auf ein Verzeichnis setCurrentDirectory() aufgerufen wird (falls nicht, dann vergiss es). Falls das Verzeichnis die Datei nicht enthält, dann nichts tun, ansonsten in das übergeordnete wechseln.
 

Meeresgott

Bekanntes Mitglied
Hallo,
Danke für deinen Tipp!
Nun kann kann der User nicht mehr in den Projekt-Ordner navigieren.

Nur weißt du welcher Methode ich dann den File übergeben muss damit der FileChooser sich danach beendet und unter getSelectedFile den Ordner ausgibt?

Eingefügt habe ich Folgenden Code:
Java:
@Override
        public void setCurrentDirectory(File f)
        {
             if (f != null) {
                if (!new File(f.getAbsolutePath() + "//" + file).exists()) {
                    super.setCurrentDirectory(f);
                }
            }
        }

LG
 

Meeresgott

Bekanntes Mitglied
Ich habe es nun geschafft.
Java:
public class JFileChooserTest {

    public static void main(String[] args) throws IOException {
        new JFileChooserTest().los();
    }

    public void los() throws IOException {
        String file = "test.txt";

        BufferedImage img = ImageIO.read(ClassLoader.getSystemResource("resorces/pngIcon.png"));
        JFileChooser f = new OverwriteProtectedFileChooser(new File(""), file);

        FileView view = new MyFileView(file, new ImageIcon(img));
        f.setFileView(view);
        f.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

        int showOpenDialog = f.showOpenDialog(null);

        if (showOpenDialog == JFileChooser.APPROVE_OPTION) {
            System.out.println("Selected File: " + f.getSelectedFile().getAbsolutePath());
        }
    }

    class OverwriteProtectedFileChooser extends JFileChooser {

        private String file;

        public OverwriteProtectedFileChooser(File file, String index) {
            super(file);
            this.file = index;

        }

        @Override
        public void setCurrentDirectory(File f) {
            if (f != null) {
                if (!new File(f.getAbsolutePath() + "//" + file).exists()) {
                    super.setCurrentDirectory(f);
                } else {
                    approveSelection();
                }
            }
        }

        @Override
        public void approveSelection() {
            File selected = getSelectedFile();

            if (getDialogType() == JFileChooser.SAVE_DIALOG
                    && getSelectedFile() != null
                    && getSelectedFile().exists()) {
                int value = JOptionPane.showConfirmDialog(this,
                        "Warning! The file \n\r" + getSelectedFile().getPath()
                        + "\n\r already exists! Overwrite it?",
                        "Warning",
                        JOptionPane.YES_NO_OPTION,
                        JOptionPane.WARNING_MESSAGE
                );

                if (value == JOptionPane.NO_OPTION) {
                    return;
                }
            }
            if (getDialogType() == JFileChooser.OPEN_DIALOG) {
                if (selected.isDirectory()) {
                    if (!new File(selected.getAbsolutePath() + "//" + file).exists()) {
                        return;
                    }
                }
            }
            super.approveSelection();
        }
    }

    class MyFileView extends FileView {

        private String file;
        private Icon fileIcon;

        public MyFileView(String file, Icon fileIcon) {
            this.file = file;
            this.fileIcon = fileIcon;
        }

        public String getName(File f) {
            return null; //let the L&F FileView figure this out
        }

        public String getDescription(File f) {
            return null; //let the L&F FileView figure this out
        }

        public Boolean isTraversable(File f) {
            return null; //let the L&F FileView figure this out
        }

        @Override
        public Icon getIcon(File f) {
            if (f != null) {

                if (new File(f.getAbsolutePath() + "\\" + file).exists())
                {
                    return fileIcon;
                }
            }
            return super.getIcon(f);

        }
    }
}

Dies ist meine Test-Klasse allerdings habe ich ein Problem. Die Abfrage bei getIcon ist derart langsam, dass jeder Klick in ein Archiv etwa 30 Sekunden beansprucht. Gibt es eine Möglichkeit eine solche Abfrage schneller hinzubekommen? Ich habe es schon mit java.nio versucht allerdings habe ich das gleiche Resultat bekommen.

LG
 

Neumi5694

Top Contributor
Einfach mal ein Schuss ins Blaue ... warum getAbsolutePath()?

Der Befehl ruft resolve() im FileSystem auf, dahinter dürften Auswertungen und Prüfungen stecken. Da wir aber bereits mit absoluter Sicherheit wissen, dass die Datei/der Ordner gültig ist, sollte getPath() genügen.
Ob das viel bringt ... einen Versuch ist's auf jeden Fall wert.
 

Meeresgott

Bekanntes Mitglied
Ja du hast recht! Mit getPath() ist er schneller allerdings immer noch so langsam, dass er in einem Programm unbrauchbar wäre.
Hier jetzt der verbesserte Code:

Java:
        @Override
        public Icon getIcon(File f)
        { 
            if (f != null)
            {
                if (new File(f.getPath()+ "\\" + file).exists())
                {
                    return fileIcon;
                }
            }
            return super.getIcon(f);
        }

Gibt es vielleicht noch einen komplett andere Ansatz zur Anzeige von Icons für den FileChooser?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W JFileChooser; nur bestimmte Datein AWT, Swing, JavaFX & SWT 5
Tommy135 JFileChooser ist sehr langsam AWT, Swing, JavaFX & SWT 13
T JFileChooser ist Englisch und bleibt Englisch und bleibt Englisch... AWT, Swing, JavaFX & SWT 15
M Swing jFileChooser Header viewTypeDetails setFont AWT, Swing, JavaFX & SWT 0
I JFileChooser mit System L&F bei anderem L&F der eigtl. Anwendung AWT, Swing, JavaFX & SWT 0
S Swing JFileChooser best. Ordner wie Dateien behandeln AWT, Swing, JavaFX & SWT 4
H Swing JFileChooser für nicht existierendes Unterverzeichnis AWT, Swing, JavaFX & SWT 3
javampir Swing Anzeige der FileFilter im JFileChooser AWT, Swing, JavaFX & SWT 0
L JFileChooser Datentyp Unterscheidung AWT, Swing, JavaFX & SWT 6
K JFileChooser NullPointerException AWT, Swing, JavaFX & SWT 7
H JFileChooser Dateinamen vorgeben (Save Dialog) AWT, Swing, JavaFX & SWT 9
Neumi5694 Swing JFilechooser - Detailansicht AWT, Swing, JavaFX & SWT 0
M JFileChooser Look and Feel AWT, Swing, JavaFX & SWT 2
T JFileChooser Rahmenfarbe ändern AWT, Swing, JavaFX & SWT 1
K Pfad mit JFileChooser ausgeben lassen AWT, Swing, JavaFX & SWT 7
C JFileChooser hängt bei Ausführung mit Terminal AWT, Swing, JavaFX & SWT 2
T Swing JFileChooser und FileView AWT, Swing, JavaFX & SWT 4
M Einzelne Ordner im JFileChooser ausgrauen? AWT, Swing, JavaFX & SWT 4
H Swing JFileChooser inline editing AWT, Swing, JavaFX & SWT 4
D JFileChooser anpassen AWT, Swing, JavaFX & SWT 5
AssELAss Verzeichnis JFileChooser aktualisieren AWT, Swing, JavaFX & SWT 0
A JFileChooser Datei speichern AWT, Swing, JavaFX & SWT 4
A Datei weiterverwenden mit JFileChooser AWT, Swing, JavaFX & SWT 6
T Importer-Auswahl im JFileChooser AWT, Swing, JavaFX & SWT 3
N JFileChooser bzw. FileDialog Problem AWT, Swing, JavaFX & SWT 10
A Swing JFileChooser - Größenänderung nach Aufruf von showOpenDialog() AWT, Swing, JavaFX & SWT 15
D Serverdirectory auf Client browsen mit JFileChooser AWT, Swing, JavaFX & SWT 7
F icon aus exe auslesen mithilfe des JFilechooser ? AWT, Swing, JavaFX & SWT 4
C JFileChooser und Netzwerk Laufwerke AWT, Swing, JavaFX & SWT 4
Iron Monkey JFileChooser - Drag and Drop AWT, Swing, JavaFX & SWT 5
J JFileChooser - Datei speichern AWT, Swing, JavaFX & SWT 7
M Element aus JList eines JFileChooser entfernen AWT, Swing, JavaFX & SWT 3
P JFileChooser mit verschidene Endungen AWT, Swing, JavaFX & SWT 12
S Swing Ordner im JFileChooser auswählen AWT, Swing, JavaFX & SWT 2
C JFileChooser bringt parent durcheinander AWT, Swing, JavaFX & SWT 2
N JFileChooser mit Dateinamenvorgabe AWT, Swing, JavaFX & SWT 9
S JFileChooser GTK (Ubuntu) "hässlich" AWT, Swing, JavaFX & SWT 2
A Swing JFileChooser mit modifiziertem Kontextmenü AWT, Swing, JavaFX & SWT 4
S JFileChooser öffnet den falschen Ordner AWT, Swing, JavaFX & SWT 4
A Swing JFilechooser zeigt verzeichnisse nicht an AWT, Swing, JavaFX & SWT 2
A Swing JFileChooser - Anzeige in Echtzeit filtern AWT, Swing, JavaFX & SWT 10
M JFileChooser umbenennen verbieten AWT, Swing, JavaFX & SWT 4
Helgon JFileChooser öffnet sich 2x AWT, Swing, JavaFX & SWT 12
K JFileChooser mit Zusatzfunktionen AWT, Swing, JavaFX & SWT 8
GUI-Programmer JFilechooser, mehrere Datein selektieren und Reihenfolge (2) AWT, Swing, JavaFX & SWT 8
V JFileChooser auf Mac und Netzwerkordner AWT, Swing, JavaFX & SWT 2
B JFileChooser breite der Spalten? AWT, Swing, JavaFX & SWT 5
M JFileChooser setCurrentDirectory() - Verzeichnis relativ zum Code/binary AWT, Swing, JavaFX & SWT 14
P Swing Dateinamen im JFileChooser vorschlagen AWT, Swing, JavaFX & SWT 11
M JFileChooser Abfangen des DateiTypen möglich?? AWT, Swing, JavaFX & SWT 5
T Swing JFileChooser --> Desktop und Laufwerke im "Suchen in" - Drop Down AWT, Swing, JavaFX & SWT 3
N JFileChooser - Keine Funtkion AWT, Swing, JavaFX & SWT 13
T JFileChooser - "Öffnen-Button" aktivieren/deaktivieren möglich??? AWT, Swing, JavaFX & SWT 2
jueki Aktuell eingestellten Filter aus einem JFileChooser abfragen. AWT, Swing, JavaFX & SWT 5
F Swing JFileChooser - Dateinamen nicht editierbar machen AWT, Swing, JavaFX & SWT 8
I Fehler bei JFileChooser AWT, Swing, JavaFX & SWT 2
K JFileChooser mehrere Dateien markieren ohne STRG AWT, Swing, JavaFX & SWT 4
Ivan Dolvich [Linux] JFileChooser sieht komisch aus... AWT, Swing, JavaFX & SWT 12
M Zurück-Button in JFileChooser AWT, Swing, JavaFX & SWT 9
N JFileChooser AWT, Swing, JavaFX & SWT 4
D Problem mit JFileChooser -> Daten werden mit anführungsstriche in JTable geschrieben AWT, Swing, JavaFX & SWT 8
S JFileChooser Dateiname Autovervollständigung AWT, Swing, JavaFX & SWT 2
B JDialog über JFileChooser anzeigen AWT, Swing, JavaFX & SWT 6
I Swing JFileChooser '\' im Pfad... AWT, Swing, JavaFX & SWT 2
K Swing JFileChooser zum Speichern - FileFilter AWT, Swing, JavaFX & SWT 2
M Swing Execption beim JFileChooser AWT, Swing, JavaFX & SWT 4
kodela Swing JFileChooser und die Datei-Extension AWT, Swing, JavaFX & SWT 3
jueki eigenen Button in JFileChooser einfügen AWT, Swing, JavaFX & SWT 7
alderwaran jFileChooser showSaveDialog, dateinamen werden mit pfadnamen überschrieben beim navigieren AWT, Swing, JavaFX & SWT 1
B Swing Suche JFileChooser zum Speichern AWT, Swing, JavaFX & SWT 2
Iron Monkey JFileChooser DIRECTORIES_ONLY AWT, Swing, JavaFX & SWT 4
Semox Swing JFileChooser: Problem Approve oder Cancel abzufangen AWT, Swing, JavaFX & SWT 7
H JTree - nach Auswahl aus JFileChooser wird nur der erste Knoten angezeigt AWT, Swing, JavaFX & SWT 3
kodela Sicherheitsabfrage mit JFileChooser AWT, Swing, JavaFX & SWT 2
DARK_ZERATO2 jFileChooser AWT, Swing, JavaFX & SWT 4
G JFileChooser Problem AWT, Swing, JavaFX & SWT 4
G Swing JFileChooser Event für neue Directory? AWT, Swing, JavaFX & SWT 5
P JFileChooser AWT, Swing, JavaFX & SWT 2
M Swing JFileChooser und JFrame AWT, Swing, JavaFX & SWT 5
G Swing JFileChooser in einem JPanel? AWT, Swing, JavaFX & SWT 3
J JFileChooser Dateiauswahl beim Tippen einschränken AWT, Swing, JavaFX & SWT 3
M Swing JFileChooser mit Windows 7 AWT, Swing, JavaFX & SWT 8
R JFileChooser - Initiales Verzeichnis auswählen AWT, Swing, JavaFX & SWT 8
brainray JFileChooser - es sollen nur Ordner wählbar sein AWT, Swing, JavaFX & SWT 2
T JFileChooser Problem AWT, Swing, JavaFX & SWT 3
N Mit JFileChooser ein Verzeichnis auswählen AWT, Swing, JavaFX & SWT 7
M Swing JFileChooser und versteckte Ordner AWT, Swing, JavaFX & SWT 2
F jFileChooser verwenden AWT, Swing, JavaFX & SWT 4
M Swing ImageIcon über JFileChooser einbinden AWT, Swing, JavaFX & SWT 4
F JFileChooser mal wieder AWT, Swing, JavaFX & SWT 2
ARadauer Swing JFileChooser mit Bildvorschau AWT, Swing, JavaFX & SWT 5
H Swing Dateiauswahldialog mit JFileChooser funktioniert unzuverlässig AWT, Swing, JavaFX & SWT 11
G Swing JFileChooser nur in Verzeichnis+Unterverzeichnisse AWT, Swing, JavaFX & SWT 5
K Swing JFileChooser AWT, Swing, JavaFX & SWT 6
M JFileChooser einschränken AWT, Swing, JavaFX & SWT 3
L JFileChooser braucht lang zum öffnen AWT, Swing, JavaFX & SWT 2
S NullPointerException bei JFileChooser AWT, Swing, JavaFX & SWT 8
M JFilechooser defaultdirectory AWT, Swing, JavaFX & SWT 5
C JFilechooser this.setAlwaysOnTop AWT, Swing, JavaFX & SWT 2
G JFileChooser - erkennen v. existierenden Dateien ohne Endung AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen

Neue Themen


Oben