JTable mit einem komplexen Editor

8

Ich habe viele benutzerdefinierte Editoren für ein JTable und es ist eine Untertreibung zu sagen, dass die Benutzerfreundlichkeit, insbesondere in Bezug auf das Editieren mit der Tastatur, fehlt.

Der Hauptgrund dafür ist, dass meine Editoren immer mit einer ähnlichen (wenn auch oft komplexeren) Situation erstellt werden:

%Vor%

I.E ein Panel mit mehr als einer Komponente im Inneren. Der eigentliche Texteditor ist ein Nachkomme der Komponente, die als Editor zurückgegeben wird. Abgesehen von dem, was ich sagen kann, fokussiert die JTable die Komponente, die von der getTableCellEditorComponent -Methode zurückgegeben wird. Wenn Sie also eine Taste mit einer hervorgehobenen Zelle drücken, wird der Fokus übergeben und die Taste gedrückt, um zu denken der Herausgeber.
Kann ich JTable trotzdem darüber informieren, dass der "echte" Editor das JTextfield ist? Das Hinzufügen eines Hacky requestFocusInWindow auf der richtigen Komponente reicht nicht aus, da der Tastendruck nicht weitergegeben wird.

    
Tom Martin 19.02.2009, 16:49
quelle

5 Antworten

4

Überprüfen Sie einige verwandte Artikel hier und hier .

Ein weiterer guter Artikel über die JTable-Bearbeitung im Allgemeinen.

    
amit 23.02.2009, 09:34
quelle
2

Wenn ich Ihre Frage richtig gelesen habe, möchten Sie, dass der Benutzer sofort in eine Zelle schreiben kann, ohne zuerst den Zelleneditor zu aktivieren, dh Sie möchten, dass bei jedem Tastendruck die Zelle als erstes Zeichen in das Textfeld eingegeben wird .

Mein erster Versuch bestand darin, der Eigenschaft focusOwner des KeyboardFocusManagers einen EigenschaftChangeListener hinzuzufügen, nur um festzustellen, dass der Fokus die JTable niemals verlässt. Du bist wahrscheinlich auch darin gelandet. Zeit für Plan B.

Ich habe dieses "erste Tastendruck" -Spiel zum Laufen gebracht, indem ich einen KeyListener zu der Tabelle hinzugefügt habe, die das letzte KeyEvent für die keyPressed () -Methode in einem Instanzfeld aufzeichnet. Die getTableCellEditorComponent () -Methode liest das Zeichen von dort. Ich brauchte auch diesen Aufruf von hacky requestFocusInWindow (), den Sie erwähnen, wenn der Benutzer nach dem ersten Zeichen weitere Zeichen eingeben soll.

Für meine Beispiel-App habe ich eine Unterklasse von JTable erstellt, die sich selbst einen KeyListener hinzufügt. Es ist eine viel bessere Idee, Ihre CellEditor-Instanz dazu zu bringen, KeyListener zu implementieren und diese stattdessen der regulären JTable hinzuzufügen, aber das überlasse ich Ihnen.

Hier ist Ihr Code-Snippet, wie ich es geändert habe:

%Vor%

Was die Gemeinheit betrifft, so sitzt das irgendwo oben bei Vogon Poetry, aber es sollte Ihr unmittelbares Problem lösen.

    
Barend 19.02.2009 19:12
quelle
0

Ich habe etwas in zwei Schritten ähnlich gemacht

Überschreibe zuerst die editCellAt von deiner JTable und rufe requestFocus nach der Vorbereitung des Editors auf:

%Vor%

Überladen Sie dann den requestFocus von Ihrem JPanel und vergewissern Sie sich, dass Ihr Textfeld als editorComponent:

angegeben ist %Vor%

Sie können das keyEvent immer abrufen und selbst festlegen:

%Vor%     
Peter 20.02.2009 08:07
quelle
0

Ich denke, dass ich es gelöst habe.
Um die Wahrheit zu sagen, ich weiß nicht, was das Problem gelöst hat, da ich einen benutzerdefinierten Editor, einen benutzerdefinierten Renderer und so weiter verwende ...

Wenn eine Zelle markiert ist und ich "abc" drücke, gehen die 3 Buchstaben auf den Bildschirm (in diesem Fall Zelle).

%Vor%

Nun ... ich habe es versucht ... =)
(Ich weiß nicht, ob es das gleiche ist, weil meine JTable JTextField und JComboBox als Editoren verwendet).

    
RicMax 04.03.2009 20:16
quelle
0

Ich hatte ein sehr ähnliches Problem. In meinem Fall hatte ich komplexe TableCellEditor , die aus Jspinner und einigen anderen Komponenten besteht. Das Problem war, dass ich beim Starten des Zelleditors den Fokus auf seine interne Komponente übertragen wollte. Ich habe das behoben, indem ich panel.transferFocusDownCycle() aufgerufen habe, aber dies hat wiederum dazu geführt, dass Tastaturereignisse nicht mehr funktionierten - wenn meine interne Komponente den Fokus hatte und ich die Taste gedrückt habe, erwartete ich, dass die Komponente dieses Ereignis abfängt und ihren Wert ändert. Stattdessen änderte die Tabelle den Zeilenfokus auf einen über ... Ich korrigierte dies, indem ich KeyListener hinzufügte und alle Schlüsselereignisse direkt an die interne Komponente weitergab.

Dies ist Wrapperklasse basierend auf JPanel Ich schrieb, um mein Leben einfacher zu machen.

%Vor%     
Bartosz Firyn 15.11.2012 21:09
quelle