JTable-Zelle mittels JFileChooser befüllen

Status
Nicht offen für weitere Antworten.
T

Touby

Gast
Hallo zusammen,

ich zerbreche mir schon seit längerem dem Kopf darüber, wie ich folgendes Problem lösen kann und komme hauptsächlich wegen dem ganzen Interface-Wirrwar bei JTables und CellEditor etc. durcheinander.

Und zwar möchte ich eine JTable erstellen in der u.a. in einer Spalte jeweils ein Pfad auf eine Datei hinterlegt werden soll. Die Zellen dieser Spalte sollen editierbar sein, allerdings so, dass sich ein JFileChooser öffnet wenn man einen Doppelklick auf der Zelle ausführt und der gewählte Dateipfad sich in die Zelle einträgt sobald man die Auswahl getroffen hat. Es soll kein einfaches "String-Editing" wie bei einer Standard-String-Zelle möglich sein.

Ich dachte, dass sowas vielleicht mit einem eigenen CellEditor möglich ist, aber selbst da bin ich mir noch so sicher. Damit ich also den Zellen mit den Dateipfaden prinzipiell einen eigenen Editor zuweisen kann habe ich für den Anfang schonmal eine Wrapper-Klasse namens FilePath erstellt, die einfach erstmal ganz banal einen String kapselt der einen Pfad repräsentieren soll:

Code:
package wos.models;

public class FilePath {

	private String filePath;
	
	public FilePath(String filePath) {
		this.filePath = filePath;
	}

	public String getFilePath() {
		return filePath;
	}

	public void setFilePath(String filePath) {
		this.filePath = filePath;
	}

	@Override
	public String toString() {
		return filePath;
	}
	
}

Mit der folgenden Zeile (xmlTable ist meine JTable) kann ich jetzt den JTable-Feldern, die Instanzen von FilePath beinhalten, nachweislich erfolgreich einen eigenen Editor zuweisen:

Code:
xmlTable.setDefaultEditor(FilePath.class, new FileTableCellEditor());

Allerdings fängt es jetzt schon an, dass ich keine Ahnung habe, wie ich die FileTableCellEditor-Klasse implementieren muss bzw. ob es auf diesem Wege überhaupt funktioniert. Denn ein CellEditor liefert meinem Verständnis nach ja im wesentlichen eine Komponente zurück, die dann für die Dauer des Editing in die Zelle eingefügt wird (also zum Beispiel ein JTextField mit dem alten Wert), aber gerade das will ich ja nicht, denn das Editing soll ja komplett von der Auswahl mittels eines JFileChooser abgefangen werden.

Kann mit da jemand weiterhelfen?
 
M

Michael...

Gast
Hallo,

grundsätzlich sei hier schon mal auf das Tutorial hier in den FAQ verwiesen.

Zum konkreten Problem: Man könnte z.B einen JButton als Editorelement verwenden. ActionListener drauf und von da aus den JFileChooser öffnen.
 
T

Touby

Gast
Michael... hat gesagt.:
Hallo,

grundsätzlich sei hier schon mal auf das Tutorial hier in den FAQ verwiesen.

Zum konkreten Problem: Man könnte z.B einen JButton als Editorelement verwenden. ActionListener drauf und von da aus den JFileChooser öffnen.

Danke schonmal für den Hinweis auf die Tutorials. Ich bin jetzt zumindest schonmal so weit, dass ich glaube, dass ein angepasster TableCellEditor nicht das ist, was ich brauche, da der ja scheinbar immer temporär den Inhalt der Zelle mit einem Swing-Element ersetzt, das editierbar ist (also zum Beispiel einem JTextField oder einem JSpinner oder...). Gerade das will ich verhindern, ich brauche ja temporär die Zelle nicht durch einen Editor ersetzen, sondern eben nur einen FileChooser öffnen und dessen Dateipfad dann in die Zelle einsetzen.

Die Lösung mit dem Button wäre mir ein Schritt zuviel: Doppelklick auf Zelle -> Button erscheint -> FileChooser öffnet sich. Den Schritt mit dem Button braucht man ja nicht unbedingt. Außerdem habe ich grundsätzlich das Problem, wie ich innerhalb des eines Editors sagen kann, dass er fertig ist mit editieren... Denke auch, dass das gar nicht geht, da er nur auf Befehle von außen reagiert über die ganzen implementierten Interfaces. Aber irgendetwas muss ja wissen, dass meine Eingabe fertig ist (also zum Beispiel RETURN bei einem JTextField). Keine Ahnung, wo das gesendet oder festgelegt wird. Glaube einfach, dass Editoren nicht für das gemacht sind, was ich vorhabe.

Habe jetzt einen neuen Lösungsansatz versucht, der prinzipiell ganz vielversprechend scheint. Und zwar kann eine JTable mit setValueAt(Object aValue, int row, int column) direkt einen Wert setzen, auch wenn er von der GUI aus nicht editierbar ist mit einem TableCellEditor, also z.B. auf diese Weise:

Code:
xmlTable.setValueAt(new FilePath("Gesetzter Wert"), 0, 6);

Ich weiß jetzt nur nicht, wie ich an die Componenten komme, die in der JTable die einzelnen Zellen darstellen um jeweils einen Listener auf z.B. MouseEvents zu registrieren. Dann kann ich beispielsweise auf Doppelklick etwas ähnliches wie die obige Zeile ausführen, nachdem zuvor ein JFileChooser den gewünschten Pfad abgefragt hat.

Ich bräuchte also JTable-Methode in der Art Component getComponentAt(int row, int column), kann sowas aber nicht finden. Gibt's da vielleicht ne andere Möglichkeit?
 
G

Grey_M_als_Gast

Gast
Das mit dem Button verstehe ich eher so.
Du ahst zwei Spalten, in der einen ist das Feld, in dem der Pfad steht, im anderen Ein Button, der beim Klicken einen Filechooser öffnest.

Ich habe sowas mal geschrieben. Wenn du dich bis heute Abend / Nacht gedulden kannst, dann kann ich es mal raussuchen und posten.

Beides geht aber über einen eigenen CellEditor und Renderer.


Nicht getestete ALTERNATIVE!
-Füge der Table einen MousListener hinzu.
-Bei der methode clicked. Überprüfst ob es ein Linksklick war und speicherst den timestamp.
-Davor fragst du jedoch ab, ob der letzte Klick auch ein Linkslick war und wann er geschah. Ist der Unterschied zwischen den Timestamps z.B. kleiner 1 sek. dann soll er einen Filechooser öffnen, welcher dann den Wert in die selektierte Zelle des tabels schreibt. Must hier noch abfragen,. ob überhaupt ne Zelle selektiert wurde und er nicht auf dem Rahmen rumgeklickt hat.

Sollte theorethisch funktionieren. Ohne CellRenderer, CellEditor und Knöpfe! :cool:
 

Grey_M

Aktives Mitglied
MHH, hast ja meine ungetestete Alternative bei dir am schluss erläutert. habe ich erst danach kapiert.

Es gibt eine Methode, die getSelectedCell() heißt. Weis jetzt nur nicht ob du die über das Tabel oder das Model der Tabel kriegst.

Damit solltest du dein letztes Problem lösen könne.
 
T

Touby

Gast
Vielen Dank für Deine Tipps, ich habe mich mit deren Hilfe soweit durchwursteln können um das Problem zu lösen. Und zwar habe ich zunächst meiner JTable (hier xmlTable) einen MouseListener hinzugefügt:

Code:
xmlTable.addMouseListener(new FileChooserMouseAdapter());

Der MouseListener ist als innere Klasse meiner JFrame-Hauptanwendung realisiert und sieht folgendermaßen aus:

Code:
class FileChooserMouseAdapter extends MouseAdapter {
	
    @Override
    public void mouseClicked(MouseEvent e) {
        
        // Nur auf Doppelklick reagieren
        if (e.getClickCount() == 2) {
            
            // Die Position der gerade ausgewählten Zelle ermitteln, denn dort muss auch der Doppelklick erfolgt sein
            int colNum = xmlTable.getSelectedColumn();
            int rowNum = xmlTable.getSelectedRow();
            
            // Nur reagieren, wenn auf eine Zelle in der siebten Spalte geklickt wurde
            if (colNum == 6) {
                
                // FileChooser erstellen
                JFileChooser fileChooser = new JFileChooser();
                // In currentDirectory merke ich mir in der umgebenden Klasse, welches Verzeichnis zuletzt benutzt wurde, um dieses für die
                // nächste Auswahl wieder anzubieten. Standardmäßig ist es null, was dem Home-Verzeichnis entspricht.
                fileChooser.setCurrentDirectory(currentDirectory);
                int returnVal = fileChooser.showOpenDialog(WallOfSoundBank.this);
                
                // Nur Änderungen vornehmen, wenn der Dialog nicht abgebrochen wurde
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    // Die ausgewählte Datei ermitteln
                    File selectedFile = fileChooser.getSelectedFile();
                    String selectedFilePath = selectedFile.getAbsolutePath();
                    // Die JTable-Zelle, auf die geklickt wurde, mit dem Pfad der ausgewählten Datei befüllen
                    xmlTable.setValueAt(new FilePath(selectedFilePath), rowNum, 6);
                    // Das für diese Auswahl benutzte Verzeichnis merken
                    currentDirectory = (selectedFile.isDirectory()) ? selectedFile.getParentFile() : selectedFile.getAbsoluteFile();
                    // Die JTable neu zeichnen um die Änderungen zu sehen
                    xmlTable.repaint();
                }
                
            }
            
        }
        
    }
	
}

Die von Dir erwähnte Funktion getSelectedCell() gibt es leider nicht, aber das Zusammenspiel aus getSelectedColumn() und getSelectedRow() funktioniert genauso gut. Vielen Dank für die Anregungen!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Best-Practise: JTable Text in Zelle zu groß AWT, Swing, JavaFX & SWT 2
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
M Swing Automatischer Editorstart in JTable-Zelle AWT, Swing, JavaFX & SWT 5
M Wert einer Zelle aus JTable ziehen AWT, Swing, JavaFX & SWT 4
P Fokus auf Zelle in JTable AWT, Swing, JavaFX & SWT 1
LexeB4F Zelle in JTable gezielt einfärben AWT, Swing, JavaFX & SWT 4
LexeB4F JTable mehrere Zelle selektieren und inhalte Löschen.. Ideen gesucht AWT, Swing, JavaFX & SWT 1
K Swing JTable mit ImageIcon und Text in einer Zelle AWT, Swing, JavaFX & SWT 1
E JTable Hintergrund von geklickter Zelle ändern AWT, Swing, JavaFX & SWT 2
M JTable: Prüfen ob Zelle leer ist AWT, Swing, JavaFX & SWT 5
O Swing JTable - Zelle fokussieren AWT, Swing, JavaFX & SWT 10
L JTable selektierte Zelle in Bearbeitungs Modus AWT, Swing, JavaFX & SWT 2
H Combobox in einer einzelnen Zelle der Jtable AWT, Swing, JavaFX & SWT 2
R Swing Hintergrundfarbe der Zelle in einer JTable bei Markierung AWT, Swing, JavaFX & SWT 2
M Jtable Objecte aus Zelle AWT, Swing, JavaFX & SWT 13
S Swing Zelle einer JTable hervorheben (ohne CellRenderer) AWT, Swing, JavaFX & SWT 3
A JTable Zelle markieren von bis und Löschen AWT, Swing, JavaFX & SWT 6
F JTable soll mit Buttons befüllt werden, aber nicht in jede Zelle einer Spalte AWT, Swing, JavaFX & SWT 3
GianaSisters Swing ComboBox im jTable (in bestimmter Zelle nicht über die ganze Spalte) AWT, Swing, JavaFX & SWT 4
O JButton in Zelle von JTable AWT, Swing, JavaFX & SWT 4
J Zelle eine JTable ändern AWT, Swing, JavaFX & SWT 3
R Drag an Drop JTable Zelle AWT, Swing, JavaFX & SWT 6
T JTable, Popup Fester per Rechtsklick auf Zelle AWT, Swing, JavaFX & SWT 19
H variable Höhe einer JTextArea (als Renderer/Editor) als Zelle einer JTable AWT, Swing, JavaFX & SWT 9
C Swing JTable zeigt in jeder Zelle einer Reihe denselben Inhalt AWT, Swing, JavaFX & SWT 2
lenniii Zelle in JTable ändern AWT, Swing, JavaFX & SWT 2
J Swing JTable, jede Zelle ein anderer Title im TitledBorder AWT, Swing, JavaFX & SWT 5
S Swing JTable nach einer Änderung einer Zelle komplett aktualisieren. AWT, Swing, JavaFX & SWT 10
N Methode zum ermitteln der editierte Zeile/Zelle in jTable AWT, Swing, JavaFX & SWT 8
C Swing JTable Zelle mit Einfachklick editieren AWT, Swing, JavaFX & SWT 3
C JTable: Mehrere Farben in einer Zelle darstellen AWT, Swing, JavaFX & SWT 10
T Swing JTable - true zurückbekommen, wenn der Cursor in einer Zelle blinkt AWT, Swing, JavaFX & SWT 7
C JTable markierte Zelle wird bei removeRow nicht mit gelöscht AWT, Swing, JavaFX & SWT 6
Dit_ Verschiedene Icons in einer JTable-Zelle AWT, Swing, JavaFX & SWT 2
A JTable Zelle Padding AWT, Swing, JavaFX & SWT 9
R JTable Hintergrund der Zeile abhängig von Inhalt einer Zelle verändern AWT, Swing, JavaFX & SWT 3
S Swing DnD: Wie finde ich heraus, von welcher Zelle aus im JTable der Drag gestartet wurde? AWT, Swing, JavaFX & SWT 3
E Zelle in JTable nach klick markieren AWT, Swing, JavaFX & SWT 2
O JTable Zelle mit "ENTER" in Editmode setzen AWT, Swing, JavaFX & SWT 4
eskimo328 JTable nächste Zelle nach Eingabe einer Ziffer AWT, Swing, JavaFX & SWT 5
B Swing Einzelne Zelle in JTable soll NICHT auswählbar sein AWT, Swing, JavaFX & SWT 9
A Swing JTable Icon nur in einer Zelle AWT, Swing, JavaFX & SWT 2
B Swing JTable merkt sich die zuletzt selektierte Zelle AWT, Swing, JavaFX & SWT 3
T einzelne Zelle einer JTable auswählen und Hintergrundfarbe ändern AWT, Swing, JavaFX & SWT 2
M JTable - verlassen einer Zelle AWT, Swing, JavaFX & SWT 15
R JTable Darstellen der selektierten Zelle braucht lange AWT, Swing, JavaFX & SWT 7
S JTable Probleme wenn ich Zelle verlasse AWT, Swing, JavaFX & SWT 4
S Welches Event beim ändern einer Zelle in einer JTable AWT, Swing, JavaFX & SWT 4
S Welches Event beim auswählen einer Zelle? [JTable] AWT, Swing, JavaFX & SWT 3
A Multiple Zeilen in einer JTable Zelle AWT, Swing, JavaFX & SWT 6
W MouseListener für jede Zelle einer JTable AWT, Swing, JavaFX & SWT 4
V JTable verliert Fokus, wie offene Zelle schliessen? AWT, Swing, JavaFX & SWT 5
G jTable, spezille Zelle automatisch füllen AWT, Swing, JavaFX & SWT 13
J JTable: Einzelne Zelle selektieren AWT, Swing, JavaFX & SWT 6
T JPanel in JTable Zelle adden AWT, Swing, JavaFX & SWT 7
S JTable zwei Text-Zeilen in einer Zelle AWT, Swing, JavaFX & SWT 2
N JTable: Informiert werden, wenn User eine Zelle editiert hat AWT, Swing, JavaFX & SWT 2
M JTable: Editieren einer Zelle "von außen" abbreche AWT, Swing, JavaFX & SWT 2
M JTable Zelle ändern -> andere Zellen mit ändern AWT, Swing, JavaFX & SWT 5
S JCbox in Jtable Zelle nur anzeigen , wenn JCombobox ="a AWT, Swing, JavaFX & SWT 3
S Eine Zeile zu einer JTable hinzufügen wo Zelle selektiert is AWT, Swing, JavaFX & SWT 4
M JTable Zelle editieren AWT, Swing, JavaFX & SWT 2
S jTable Font einer Zelle ändern AWT, Swing, JavaFX & SWT 5
G Bei JTable eine bestimmte Zelle färben AWT, Swing, JavaFX & SWT 11
V JTable Zelle über befehl "selecten"? AWT, Swing, JavaFX & SWT 5
G JTable-Zeile/Zelle markieren und mir Shortcut in Arbeitsspei AWT, Swing, JavaFX & SWT 3
D JTable: Focus auf Zelle markiert ihren Text zum editieren AWT, Swing, JavaFX & SWT 2
S Farbe einer Zelle in JTable ändern AWT, Swing, JavaFX & SWT 13
J JList-Item ind JTable-Zelle auswählen. AWT, Swing, JavaFX & SWT 5
R JTable: Jede Zelle mit eigenem ToolTip belegen AWT, Swing, JavaFX & SWT 5
R Drag & Drop einer einzelnen Zelle (JTable) AWT, Swing, JavaFX & SWT 2
T JTable Focus auf Zelle setzen AWT, Swing, JavaFX & SWT 3
R Focus durch "tabben" von JTable Zelle auf andere K AWT, Swing, JavaFX & SWT 8
V JTable: Bei Klick in Zelle -> Ganze Zeile markeiren AWT, Swing, JavaFX & SWT 7
W JTable und mehrere Components in einer Zelle AWT, Swing, JavaFX & SWT 4
S JTree in einer JTable-Zelle AWT, Swing, JavaFX & SWT 6
G JTable: Rahmen bei Focus um Zelle AWT, Swing, JavaFX & SWT 2
W Problem/Absturz bei Zelle nicht editierbar setzen (JTable) AWT, Swing, JavaFX & SWT 6
R JTable - Boolean-Wert aus Zelle auslesen. AWT, Swing, JavaFX & SWT 9
T "..." am Ende der Zelle in JTable AWT, Swing, JavaFX & SWT 2
G JTable Zeilenumbruch innerhalb einer Zelle bzw. columnHeader AWT, Swing, JavaFX & SWT 1
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
S HPRO und UPRO gemeinsame JTABLE gemeinsamer RENDERER ? AWT, Swing, JavaFX & SWT 1
F Swing JTable - MultiHeader inkl. Eingabemöglichkeit AWT, Swing, JavaFX & SWT 1
S JTable - Feldinhalte anzeigen AWT, Swing, JavaFX & SWT 15
D Swing JTable Spaltenbreite AWT, Swing, JavaFX & SWT 1
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
G jTable - getSelectedRow() AWT, Swing, JavaFX & SWT 3
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
D Tastaturabfragen CTRL+t, CTRL+E bei eine JTable, bestehend aus JTextAteas AWT, Swing, JavaFX & SWT 4
P Checkboxes in JTable nicht editable AWT, Swing, JavaFX & SWT 9
izoards JTable in CSV File schreiben... AWT, Swing, JavaFX & SWT 23
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
I JTable, DefaultTableModel, zwei Zahlen multiplizieren. AWT, Swing, JavaFX & SWT 26
M JTABLE / wie oft wurde gewürfelt. AWT, Swing, JavaFX & SWT 1
F JTable vergrößern AWT, Swing, JavaFX & SWT 2
H JTable: Diverse NullPointer-Exceptions zur Laufzeit AWT, Swing, JavaFX & SWT 3
J Swing Werte des JTable werden nicht angezeigt AWT, Swing, JavaFX & SWT 9

Ähnliche Java Themen

Neue Themen


Oben