Swing filechooser - nur Netzwerkpfade anzeigen lassen

Status
Nicht offen für weitere Antworten.

egge

Mitglied
Hallo,
ich habe da ein kleines Problem.
Wie kann ich in einem filechooser nur die Netzlaufwerke anzeigen lassen?
Also standardmäßig werden alle vorhanden Laufwerke angezeigt. Die lokalen Laufwerke, sowie CD-Rom oder DVD-Laufwerk sollen nicht in der Auswahl auftauchen.

Hat jemand eine Idee...

Schon mal vielen Dank im Voraus
 
naja, wenn was manuelles reicht:
Du kannst nen FileFilter adden der Files wie "E:\\" nicht akzeptiert...
 
Danke für die schnelle Antwort.

So reicht es leider nicht.
Ich müsste irgendwie raus bekommen, welches Laufwerk ein Netzlaufwerk ist und dieses dann dem filechooser hinzufügen.
Die Laufwerksbuchstaben ändern sich und sind bei jedem Client unterschiedlich.
Hab aber keine Idee wie ich das umsetze.
Es muss doch aber irgendwie gehen. Manche Programme zeigen doch beispielsweise auch nur Wechseldatenträger zur Auswahl an.
 
ich hab mich damit leider noch nicht beschäftigt, aber vielleicht gibt es irgendwie eine Möglichkeit dies über die IP zu regeln, welches Laufwerk gehört zum Localhost 127.0.0.1
 
Da ich grad kein Netzwerklaufwerk zum testen hab, hier mein Vorschlag:
gucken ob das Ergebniss von
File#toURI().getPort()
gleich -1 ist ?!
 
File#toURI().getPort()
Das wird so leider nichts. Netzwerkpfade im Windows sind UNC-Pfade. Wenn man sie in eine URI umwandelt kommt da auch nur das raus:
Code:
file://someWindowsHost/some/path/to/file
Da ist kein Port angegeben. Du würdest also nur -1 zurückbekommen; für jedes File.

Ebenius
 
Also ich versuche gerade einen FileFilter zu basteln, aber ich dachte mit dem kann man nur festlegen, ob zum Beispiel .txt usw angezeigt werden sollen.
Weiß jemand wie man damit umgeht?
 
Naja das Erstellen des Filefilter-Objekts klappt soweit, aber wie kann ich damit nur die Netzwerkpfade ausfiltern lassen?
 
Java:
FileSystemView view = new FileSystemView() {

            @Override
            public File createNewFolder(File containingDir) throws IOException {
                for (File f : File.listRoots()) {
                    // ???????
                }


                throw new UnsupportedOperationException("Not supported yet.");
            }
        };

        for (File f : File.listRoots()) {
            System.err.println(view.getSystemTypeDescription(f));

        }

        jFileChooser1.setFileSystemView(view);


Also das ist mein Versuch eine eigene FileSystemView zu erstellen.
Nur was kommt anstatt den Fragezeichen in die for-Schleife?
Ich hab keine Ahnung ob das der richtige Ansatz ist...
 
Ich habe mal versucht etwas in Kombination aus FileFilter und FileSystemView zu basteln. Hänge aber noch an der Manipulation von ComboBox und HomeDirectory des FileChoosers.

Java:
import java.io.*;

import javax.swing.JFileChooser;
import javax.swing.filechooser.FileSystemView;
import javax.swing.filechooser.FileFilter;

public class FileChooserTest {
	private static JFileChooser fileChooser;
	
	public static void main(String[] args) throws Exception{
		
		fileChooser = new JFileChooser();
		RestrictedFileSystemView fsView = new RestrictedFileSystemView(fileChooser.getFileSystemView());
		
		fileChooser.setFileSystemView(fsView);
		fileChooser.setCurrentDirectory(fsView.getHomeDirectory());
		fileChooser.addChoosableFileFilter(fsView.getFileFilter());
		fileChooser.setAcceptAllFileFilterUsed(false);
		
		fileChooser.showOpenDialog(null);
		System.exit(0);
	}
}

class RestrictedFileSystemView extends FileSystemView {
	private File[] roots;
	
	public RestrictedFileSystemView(FileSystemView fsView) {
		roots = File.listRoots();
		java.util.Vector r = new java.util.Vector();
		
		for (int i=0; i<roots.length; i++) {
			if (fsView.getSystemTypeDescription(roots[i]).equalsIgnoreCase("Netzlaufwerk"))
				r.add(roots[i]);
		}
		roots = new File[r.size()];
		for (int i=0; i<r.size(); i++) {
			roots[i] = (File)r.get(i);
		}
	}
	
	public File createNewFolder(File file) throws IOException {
		return null;
	}
	
	public File getHomeDirectory(){
		return this.roots[0];
	}
	
	public File getDefaultDirectory() {
		return this.roots[0];
	}
	
	public File[] getRoots() {
		return this.roots;
	}
	
	public FileFilter getFileFilter() {
		return new FileFilter() {

			public boolean accept(File file) {
				for (int i=0; i<roots.length; i++) {
					if (file.getAbsolutePath().startsWith(roots[i].toString()))
						return true;
				}
				return false;
			}

			public String getDescription() {
				return "nur Netzwerkzugriff";
			}
		};
	}
}
 
Danke Michael.
Ich habe den Quellcode ausprobiert. Funktioniert echt super.
Ich sehe zwar in der Combobox noch alle Laufwerke, aber sobald ich ein lokales Laufwerk aufwähle, werden darin keine Dateien angezeigt. Das ist echt super.

Vielen, vielen Dank für eure Unterstützung.

Gruß egge
 
Zuletzt bearbeitet:
Wenn das so schon reicht, kannst Du ja den FileFilter aus der FileSystemView-Klasse rauslösen und denn Rest davon wegschmeißen.
 
Hallo,

ersteinmal danke für den hier gezeigten Code, das war schon sehr nützlich. Ich weiß, dass der eigentliche TS nun nichts von meiner Hilfe haben wird, da dies nun 1,5 Jahre her ist. Da ich aber durch google auf diesen Thread gestoßen bin geht es anderen vielleicht ähnlich.

Um das Verhalten der ComboBox (im Windows L&F!) auch durch den FileSystemView bestimmen zu lassen muss eine ClientProperty gesetzt werden:
Java:
fc.putClientProperty("FileChooser.useShellFolder", Boolean.FALSE);

Allerdings hat dies bei Instanziierung wie oben gezeigt keine Auswirkung mehr. Es funktioniert, wenn man es folgendermaßen ändert:
Java:
static class RestrictedFileSystemView extends FileSystemView {
		private File[] roots;

		public RestrictedFileSystemView() {
			super();
			FileSystemView fsv = FileSystemView.getFileSystemView();
			roots = File.listRoots();
			java.util.Vector r = new java.util.Vector();

			for (int i = 0; i < roots.length; i++) {
				if (fsv.getSystemTypeDescription(roots[i]).equalsIgnoreCase("Netzlaufwerk")
						|| fsv.getSystemTypeDescription(roots[i]).equalsIgnoreCase("Wechseldatenträger"))
					r.add(roots[i]);
			}
			roots = new File[r.size()];
			for (int i = 0; i < r.size(); i++) {
				roots[i] = (File) r.get(i);
			}
		}

		@Override
		public File createNewFolder(File file) throws IOException {
			return null;
		}

		@Override
		public File getHomeDirectory() {
			return this.roots[0];
		}

		@Override
		public File getDefaultDirectory() {
			return this.roots[0];
		}

		@Override
		public File[] getRoots() {
			return this.roots;
		}

		public FileFilter getFileFilter() {
			return new FileFilter() {
				@Override
				public boolean accept(File file) {
					if (file.isFile()) {
						// nur .pdf Dateien anzeigen
						if (!file.getAbsoluteFile().toString().endsWith(".pdf")) {
							return false;
						}
					}
					for (int i = 0; i < roots.length; i++)
						if (file.getAbsolutePath().startsWith(roots[i].toString()))
							return true;
					}
					return false;
				}

				@Override
				public String getDescription() {
					return "*.pdf";
				}
			};
		}
	}

Den FileChooser dann folgendermaßen erstellen:
Java:
            RestrictedFileSystemView fsView = new RestrictedFileSystemView();

			JFileChooser fc = new JFileChooser(fsView);

			fc.putClientProperty("FileChooser.useShellFolder", Boolean.FALSE);
			fc.setFileSystemView(fsView);
			fc.setCurrentDirectory(fsView.getHomeDirectory());
			fc.addChoosableFileFilter(fsView.getFileFilter());
			fc.setAcceptAllFileFilterUsed(false);

Wobei die Implementierung für meine Bedürfnisse abgeändert habe, dürfte aber klar sein.

Vielleicht nützt es ja jemanden.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben