Swing JFileChooser - Größenänderung nach Aufruf von showOpenDialog()

Annoraaq

Mitglied
Hallo zusammen,

ich habe eine Klasse erstellt, die vom JFileChooser erbt. Diese soll unter anderem für eine Größenanpassung von diesem nach einem Verzeichniswechsel sorgen. Ich habe jetzt folgendes Problem:

Wenn ich die Größe anpasse, bevor ich die showOpenDialog()-Methode des FileChoosers aufrufe, funktioniert alles. Ich habe allerdings einen PropertyListener hinzugefügt, der bei jedem Verzeichniswechsel eine Methode aufruft. Der Methodenaufruf funktioniert auch super, was eine Konsolenausgabe beweist. Das Problem ist nur, dass der JFileChooser jegliche Größenänderungen ignoriert, die nach Aufruf der showOpenDialog()-Methode gemacht werden.
Weiß da vielleicht jemand eine Lösung?

Vielen Dank.

LG
Annoraaq
 

Kevin94

Top Contributor
Ein Dialog hat eine feste Größe und die ändert er nicht, nur weil die Componenten die darauf liegen, größer sein wollen. Du musst auf dem Dialog pack() oder setSize() aufrufen, damit er das tut. Um an den offenen Dialog zu kommen (ohne Reflections) ist es das einfachste wenn du createDialog() überschreibst, nur die Standart-Implementierung aufrufst und diesen JDialog dann in einer Instanzvariable speicherst.
 

Annoraaq

Mitglied
Vielen Dank!
Das mit dem JDialog hat super funktioniert.

Ich habe allerdings noch ein ähnliches Problem. Ich möchte nun die erste Spalte der Tabelle vergrößern. Dazu mache ich folgendes:
Java:
this.jTable.getColumnModel().getColumn(0).setPreferredWidth(400);

Die Tabelle bleibt allerdings klein und auch die erste Spalte verändert ihre größe nicht. Wenn ich die preferredWidth der Spalte allerdings ausgeben lasse, steht dort 400. Die zuweisung der Breite hat also funktioniert, es wird nur nicht dargestellt.

Der komplette Code-Abschnitt:
Java:
Dimension dim;
		dim = new Dimension(1300, 500);
		
		this.jTable.setPreferredSize(dim);
		this.jTable.getColumnModel().getColumn(0).setPreferredWidth(400);
		this.jTable.repaint();

		this.setPreferredSize(dim);
		this.repaint();
		this.jDialog.pack();

Der JFileChooser passt seine Größe schon an, die Tabelle und die Spalte allerdings nicht.
Ich weiß nicht, ob das repaint() dort wirklich Sinn macht, aber ich habe es sicherheitshalber hingeschrieben.
 

Kevin94

Top Contributor
Es ist das selbe, wie mit dem Dialog. Nur weil du was setzt, wird das nicht (sofort) übernommen. Damit die Änderung sicher übernommen wird, reicht ein repaint() nicht aus, du musst ein revalidate() machen.
 

Annoraaq

Mitglied
Ich habe jetzt zusätzlich zum repaint() noch revalidate() aufgerufen. In der gleichen Reihenfolge wie die Größenändeurng, also erst bei der JTable, dann beim JFileChooser und dann beim JDialog.
Leider bleibt die Tabellengröße und die Größe der Spalte noch unverändert.

Java:
		Dimension dim;
		dim = new Dimension(1300, 500);
		
		this.jTable.setPreferredSize(dim);
		this.jTable.getColumnModel().getColumn(0).setPreferredWidth(400);
		this.jTable.repaint();
		this.jTable.revalidate();

		this.setPreferredSize(dim);
		this.repaint();
		this.revalidate();
		
		this.jDialog.revalidate();
		this.jDialog.pack();
 
Q

qwegrhntu

Gast
PreferredWidth ist ja nur die bevorzugte Breite und wird je nach Größe und eingestelltem Columnverhalten berücksichtigt.
Eine Spaltenbreite kann man mit den entsprechenden Methoden setMax und Min Width erzwingen.
 

Annoraaq

Mitglied
Hmm, habe jetzt zusätzlich noch setMinWidth(), setMaxWidth(), bzw setMinSize(), setMaxSize() und noch setWidth() bzw setSize() benutzt. Trotzdem scheint noch etwas zu fehlen, denn es funktioniert nicht.

Java:
		Dimension dim;
		dim = new Dimension(1300, 500);
		
		this.jTable.setPreferredSize(dim);
		this.jTable.setSize(dim);
		this.jTable.setMinimumSize(dim);
		this.jTable.setMaximumSize(dim);
		this.jTable.getColumnModel().getColumn(0).setPreferredWidth(400);
		this.jTable.getColumnModel().getColumn(0).setMinWidth(400);
		this.jTable.getColumnModel().getColumn(0).setMaxWidth(400);
		this.jTable.getColumnModel().getColumn(0).setWidth(400);
		this.jTable.repaint();
		this.jTable.revalidate();

		this.setPreferredSize(dim);
		this.repaint();
		this.revalidate();
		
		this.jDialog.revalidate();
		this.jDialog.pack();
 
Q

qwegrhntu

Gast
Java:
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 
Q

qwegrhntu

Gast
Java:
	public static void main(String[] s) {
		JFrame frame = new JFrame();
		frame.setBounds(0, 0, 1300, 500);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		JTable table = new JTable(3, 2);
		table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
		table.getColumnModel().getColumn(0).setMaxWidth(400);
		table.getColumnModel().getColumn(0).setMinWidth(400);
		frame.add(new JScrollPane(table));
		frame.setVisible(true);
	}
 

Annoraaq

Mitglied
Bei deinem Beispiel scheint es zu funktionieren.
Ich glaube nicht, dass es mit der JTable an sich liegt, sondern damit zusammenhängt, dass die jTable im jFileChooser ist. Wenn ich mir allerdings die Breite der Spalte ausgeben lasse, zeigt er mir den richtigen Wert an, nur er rendert es nicht. Ich habe mir auch bei jedem Verzeichniswechsel die Inhalte der Tabelle auf der Konsole ausgeben lassen, um sicherzugehen dass ich auch noch das korrekte Tabellenobjekt habe.
 

Annoraaq

Mitglied
Bei deinem Beispiel geht es mit sicherheit, weil das Tabellenobjekt noch vor dem Rendern in der Größe festgelegt wird.

Um an das JTable-Objekt im JFileChooser zu kommen bin ich folgende Component-Hirarchie durchlaufen:

JFileChooser->JPanel->FilePane->JPanel->JScrollPane->Viewport->(View = JTable)

Um die Größe des JFileChoosers zu aktualisieren musste ich ja pack() auf dem JDialog aufrufen.
Wenn ich jetzt einfach die Größe vom JTable-Objekt ändere, welche Objekte muss ich dann wie updaten, damit die Änderung sichtbar wird? Habe ich da eventuell ein wichtiges Objekt ausgelassen?

LG
Annoraaq
 

Annoraaq

Mitglied
Ok, also ich bin ein ganzes Stück schlauer geworden, allerdings der Lösung kein Stück näher.

Der Grund dafür, dass die Änderung sich nicht zeigt liegt hieran:

Die einzige Möglichkeit an die JTable zu kommen, ist über die Methode createTableView(), der Klasse FilePane. Diese gibt allerdings eine Instanz zurück, die mit final versehen wurde. Außerdem wird die Methode tableChanged() der JTable-Klasse überschrieben. Diese wird immer aufgerufen, wenn man an der JTable etwas ändert (beispielsweise das TableModel verändert). In der überschriebenen tableChanged()-Methode wird dann eine private Methode von FilePane aufgerufen, die leider folgendes tut: Sie geht alle Spalten der Tabelle durch und ersetzt die Breitenangaben mit Angaben die aus einem intern in FilePane gespeicherten TableModel kommen. Das heißt jede Änderung die ich an der Spaltenbreite mache, führt dazu dass tableChanged() aufgerufen wird, was dann dazu führt dass alle Spaltenbreiten mit anderen Werten überschrieben werden, an die ich nicht heran komme, weil da alles private ist.

Mein zweiter Gedanke war dann eine Klasse von FilePane abzuleiten und in dieser die betroffenen Methoden zu überschreiben. Leider geht das nicht, da FilePane im Konstruktor die Implementierung eines Interfaces benötigt, welches dazu dient, auf die privaten Methoden der Klassen die von FileChooserUI erben zuzugreifen. Die Klassen die von FileChooserUI erben sind beispielsweise WindowsFileChooserUI oder MetalFileChooserUI. Natürlich kann aufgrund des zu implementierenden Interfaces eine Instanz von FilePane lediglich innerhalb dieser UI-Klassen geschehen.

Somit sind mir alle Möglichkeiten verbaut... oder weiß da jemand noch etwas?

LG
Annoraaq
 

Kevin94

Top Contributor
Entweder du schreibst dir deine eigene UI-Implementierung (du kannst ja 90% von einem vorhanden kopieren) oder du gehst da mit Reflections ran, vielleicht hilft dir die Klasse Proxy auch.
Alles nicht umbedingt empfehlenswert und ich würde mir die Frage stellen wozu das ganze, ist es den Aufwand überhaupt Wert.
 

Annoraaq

Mitglied
Hallo Kevin,

vielen Dank erst mal für deine Antwort. Ich probiere es gerade mit der UI-Implementierung und ich habe in der Tat so gut wie alles kopiert. Ich bin mal gespannt was das wird, denn ich muss das ja für alle Look & Feels machen. Ansonsten werde ich es mit Reflections probieren. Daran habe ich noch gar nicht gedacht.

Ob es sich lohnt habe ich mich auch schon gefragt, aber mir ist keine einfachere Lösung eingefallen. Tatsache ist, dass ich die Breite der Tabelle ändern muss bei einem Verzeichniswechsel (sie soll sich dem längsten Namen anpassen). Die einzige Alternative zum mühsamen modifizieren des JFileChoosers ist meines Erachtens nach die Implementierung eines eigenen FileChoosers. Und davor scheue ich zurück, da ich sonst das Rad in mühsamer Arbeit neu erfinden muss. Falls jemandem eine anderen Lösung einfällt, wäre ich natürlich auch sehr erfreut^^

LG
Annoraaq
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
Meeresgott AWT JFileChooser bestimmte Ordner anzeigen AWT, Swing, JavaFX & SWT 16
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
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
N JFilechooser File auslesen AWT, Swing, JavaFX & SWT 10

Ähnliche Java Themen

Neue Themen


Oben