Announcement

Collapse
No announcement yet.

JFileChooser, genau dieses Directory - ohne Bedingungen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • JFileChooser, genau dieses Directory - ohne Bedingungen

    Hi @ all

    Ja, ich bin neu hier, Ja, ich habe Erfahrung mit Java, Ja, ich habe die SuFu genutzt (und keine befriedigende Antwort gefunden xP) und Ja ... schon wieder mal ein Problem mit dem JFileChooser (hier kurz: jfc)...

    Über kurz oder lang geht es um folgendes Problem:
    Ich möchte mit dem jfc nur ein Directory auswählen. Dies ist im generellen kein Problem, doch im spezifischen Sinne genau das Directory zu bekommen, welches vom User her wohl verlangt wird ist das Schwierige!

    Ich wäre sehr glücklich darüben, wenn ihr Euch kurz einen Moment nehmen könntet um Euch das Code-Exzerpt anzusehen und noch die Schlussfolgerung durchzulesen.

    Code:
    JFileChooser chooser = new JFileChooser(); 
    chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
    chooser.setDialogTitle("Standardpfadauswahl");
    chooser.setApproveButtonToolTipText("Wählt den Ordner als neuen Standardpfad aus.");
    chooser.setToolTipText("nunmal egal");
    chooser.setApproveButtonText("Pfad auswählen");
    chooser.setCurrentDirectory(this.currentDirectory_);        //currentDirectory_ ist eine Instanzvariable für den letzten verwendeten Pfad
            
    int returnVal = chooser.showOpenDialog(this.getMainFrame());        //Methode ist selbsterklärend
            
    if (returnVal == JFileChooser.APPROVE_OPTION){
        machWasMitFilePfad(chooser.getCurrentDirectory());
        this.setStatus("Neuer Standardpfad gesetzt. ( " + chooser.getCurrentDirectory() + " )");        //Ausgabe im Frame
        this.currentDirectory_ = chooser.getCurrentDirectory();
    } else {
        setStatus("Kein neuer Standardpfad gewählt.");        //Ausgabe im Frame
    }
    Nun zum Problem das hier entsteht:
    Ich verwende die Methode "getCurrentDirectory()" die mir ein File zurückgibt welches im setStatus als toString() zur Geltung kommt.
    Annahme: wir befinden uns jetzt im Directory "E:\". Wählt man nun auf "Pfad wählen", also den "OK" Btn sozusagen, bekommt man mit getCurrentDirectory() nur "C:\Users\xyz\Documents" zurück. Dies passiert, wenn man keinen Inhalt des Ordners gewählt hat. Gut, wenn man das weiß, dann wählt man eben einen Unterordner von "E:\" aus. Ohne Beschränkung der Allgemeinheit sei dies "E:\Test". Nun wird "E:\" bei getCurrentDirectory() als toString() zurückgegeben. Der Witz ist nun der, falls man sich in den Ordner "E:\Test" bewegt, und diesen nun eigentlich ausgewählt haben möchte, bekommt man ebenfalls nur "E:\" zurück. Man muss wieder einen Unterordner von "E:\Test" wählen um dann "E:\Test" auch wirklich zu bekommen.

    Ich bin in der Überlegung dann mal weitergegangen und versuchte es mit der Alternative "getSelectedFile()", die mir auch ein File zurückgibt und dessen toString() dann den gewünschten Ordner "E:\Test" zurückgibt, wenn man sich nun auch nur in diesem befindet. Allerdings besteht nun das Problem, falls man einen Unterordner wählt (sagen wir mal von "E:\Test" ausgehend "E:\Test\Ordner1") ohne in ihn hineinzugehen, so liefert getSelectedFile() diesen Ordner (also "E:\Test\Ordner1") zurück, obwohl wir uns noch in "E:\Test" befinden.

    Verlangt wird die ganze Zeit über nur das Directory in dem man sich befindet, ohne dafür was tun zu müssen. Ist dies in irgendeiner Art möglich?

    Fall ihr euch nun die Mühe angetan habt diese Wurscht zu durchlesen und Euch eventuell darüber Gedanken gemacht habt, bin ich Euch schon dankbar ... noch mehr natürlich falls jemand auch eine Lösung aus dieser Misere findet/kennt und sie mir hier mitteilen könnte .

    mfg
    Sanakan
    Don't call it Bug, call it Feature!

  • #2
    Bau mal folgenden Aufruf zusätzlich ein und schau' mal, ob dir der Wert von getSelectedFile() gefällt:

    Code:
    	chooser.addPropertyChangeListener(new PropertyChangeListener() {
    			//To prevent reentry
    			private boolean handlingEvent=false;
    			public void propertyChange(PropertyChangeEvent e) {
    				//Prevent reentry
    				if (handlingEvent)
    					return;
    				else
    					//Mark it as handling the event
    					handlingEvent=true;
    
    				String propertyName = e.getPropertyName();
    
    				//We are interested in both event types
    				if(propertyName.equals(JFileChooser.SELECTED_FILE_CHANGED_PROPERTY) ||
    						propertyName.equals(JFileChooser.DIRECTORY_CHANGED_PROPERTY)){
    
    					File selectedFile = (File) e.getNewValue();
    					if (selectedFile!=null) {
    						if (selectedFile.isDirectory()) {
    							//Allow the user to navigate directories with single click
    							chooser.setCurrentDirectory(selectedFile);
    						} else {
    							chooser.setSelectedFile(selectedFile);
    							if (chooser.getSelectedFile()!=null)
    								//Accept it
    								chooser.approveSelection();
    						} 
    					} 
    				}
    
    				//Allow new events to be processed now
    				handlingEvent=false;
    			}
    		});
    Als "Nebeneffekt" benötigt man keinen Doppelklick mehr um ein Verzeichnis auszuwählen.

    Comment


    • #3
      Joo, damit geht das wohl
      Christian

      Comment


      • #4
        Großes Lob an die Community

        Erstmal: ein groooßes Dankeschön
        Ohne dich Ramon wär ich wohl noch sehr lange dabeigesessen ^^.

        Es ist zwar nicht direkt das was ich benötige, aber es zielt genau in die richtige Richtung.

        Es ist Gewöhnungssache ob man lieber mit einem oder zwei Mausklicks navigiert. Ich bevorzuge ersteres. Deshalb hab ich deinen Code ein wenig umgeschrieben. JFileChooser schneidet scheinbar am Schluss, wenn man auf den "OK" Btn drückt, den letzten Teil bis zum "/" (Slash) weg und benennt es dann als sein Directory. Im ChangeListener lässt sich sehr gut damit umgehen.

        Der Code wie er nun aussieht:
        Code:
                chooser.addPropertyChangeListener(new PropertyChangeListener() {
                    //To prevent reentry
                    private boolean initialisation_ = true;
                    private boolean handlingEvent = false;
                    private File temp_ = new File(".");
                    public void propertyChange(PropertyChangeEvent e) {
                        //Prevent reentry
                        if (handlingEvent){
                            return;
                        } else {
                            //Mark it as handling the event
                            handlingEvent=true;
                        }
                        
                        String propertyName = e.getPropertyName();
        
                        //First we need to check the initialisation_ boolean and after the first directory change event there can be selected file change events
                        if(propertyName.equals(JFileChooser.SELECTED_FILE_CHANGED_PROPERTY)  && !initialisation_){
                            if((currentDirectory_.toString().lastIndexOf("/")==chooser.getSelectedFile().toString().lastIndexOf("/") && 
                                    currentDirectory_.toString().length()!=chooser.getSelectedFile().toString().length())||
                                    chooser.getCurrentDirectory().equals(e.getOldValue())){
                                currentDirectory_ = temp_;
                            }
                        }
                        
                        //We are interested just in one event type (dir)
                        if(propertyName.equals(JFileChooser.DIRECTORY_CHANGED_PROPERTY)){
                            if(e.getOldValue()!=null){
                                currentDirectory_ = (File) e.getOldValue();
                            } else {
                                currentDirectory_ = (File) e.getNewValue();
                            }
                            initialisation_ = false;
                            temp_ = (File) e.getNewValue();
                        }
        
                        //Allow new events to be processed now
                        handlingEvent = false;
                    }
                });
        Im currentDirectory_ wird genau immer der aktuelle Ordner gesichert, den der User sieht. Damit wäre das Problem gelöst.

        Nochmals Danke.

        mfg
        Sanakan

        PS: sry, für den Edit, aber mir fielen im Nachhinein noch ein paar Fehler auf. Falls i-was nicht stimmen sollte bin ich natürlich Kritik oder Verbesserungsvorschlägen gegenüber offen.
        Zuletzt editiert von Sanakan; 05.02.2010, 20:03.
        Don't call it Bug, call it Feature!

        Comment

        Working...
        X