Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ist es möglich bei dem JFileChooser die Größe der Spalten die angezeigt wird zu beeinflußen oder vll auch Spalten auszublenden? Ich finde da leider keine Option.
Habe auch durch nen "Hack" erst erreichen können das die Darstellung von Liste auf Details ist sodass alle Elemente in dem Ordner untereinander stehen. Jetzt würde ich da halt gerne die Spalte "Name" ganz breit haben.
Das ist nicht so ganz das was ich Suche. Bin aber schon mal durch ausprobieren was weiter gekommen:
Java:
JFileChooser fc = new JFileChooser(".");
JTable tbl = findJTable(fc.getComponents())
private final static JTable findJTable(Component[] comp) {
for (int i = 0; i < comp.length; i++) {
if (comp[i] instanceof JTable) {
return (JTable) comp[i];
}
if (comp[i] instanceof Container) {
JTable tbl = findJTable(((Container) comp[i]).getComponents());
if (tbl != null) {
return tbl;
}
}
}
return null;
}
Dies war eine Lösung die ich gefunden habe. Jedoch kriege ich nie eine Komponente vom Typ JTable. Es gibt in dem FileChooser jede Menge Buttons und Labels (die über und unter der Tabelle) aber die JTable find ich nicht. Innerhalb der ScrollPane und des Viewports gibt es eine FilePane. Aber die enthält auch kein JTable ???:L
sorry dass ich diesen Thread wieder ausgrabe, aber ich habe das gleiche Problem. Ich muss an die JTable des JFileChoosers. Ich bin auch rekursiv alle Components durchgegangen und bekomme ebenfalls kein JTable-Objekt wieder. Eventuell hat der Ersteller dieses Threads mittlerweile eine Lösung gefunden?
nach vielen Stunden des Probierens und der Recherche habe ich es geschafft. Erstmal die Erklärung und unten dann der Code.
Das JFileChooser-Objekt enthält ein Objekt der schlecht Dokumentierten Klasse FilePane. Dieses Objekt erhält man einfach indem man über die Components des JFileChooser-Objekts iteriert und mit instanceof auf FilePane prüft. Glücklicherweise habe ich eine Website gefunden auf der der Quelltext von FilePane vorzufinden war (leider ohne Kommentare und mit vielen internen Klassen und privaten Variablen). Jedenfalls gibt es in diesem Objekt zum einen die Möglichkeit den ViewType auf DetailsView zu setzen und andererseits die Möglichkeit, sich mit einem kleinen Umweg das JTable-Objekt zurückgeben zu lassen. Zuerst müssen wir uns dazu das JPanel holen, welches das JTable-Objekt enthält. Das müssen wir aufgrund der seltsamen private/public-Politik der Verfasser über die Methode createDetailsView() machen. Danach iterieren wir über die Objekte in diesem JPanel und prüfen mit instanceof auf ein JScrollPane. Aus diesem holen wir uns dann endlich mit getViewport().getView() das JTable-Objekt. Meiner Meinung nach hätte man auch einfach eine Methode für diesen Zweck zum JFileChooser hinzufügen können, aber naja...
Ich kann ja akzeptieren, dass der JFileChooser nur für einfache Dateiauswahl gedacht ist und man für komplizierte Zwecke lieber einen eigenen Dialog erstellt, allerdings könnte man den Zugriff auf die sowieso schon enthaltenen Elemente vereinfachen.
Java:
/**
* Holt das JTable-Objekt aus einem FileChooser
*
* @param c
* @return
*/
private JTable getJTable(JFileChooser fileChooser) {
JScrollPane sp = getJScrollPane(fileChooser.getComponents());
JTable table = (JTable) sp.getViewport().getView();
return table;
}
/**
* Durchsucht ein Component-Array nach einem JScrollPane
*
* @param c
* @return
*/
private JScrollPane getJScrollPane(Component[] c) {
FilePane fp = getFilePane(c);
JScrollPane sp = null;
if (fp != null) {
JPanel p = fp.createDetailsView();
Component[] cp = p.getComponents();
for (int i=0; i<cp.length; i++) {
if (cp[i] instanceof JScrollPane) {
sp = (JScrollPane) cp[i];
}
}
}
return sp;
}
/**
* Durchsucht ein Component-Array nach einem FilePane
*
* @param c
* @return
*/
private FilePane getFilePane(Component[] c) {
for (int i=0; i<c.length; i++) {
if (c[i] instanceof FilePane) {
return (FilePane) c[i];
}
}
return null;
}