Fokusproblem mit einer JComboBox als Zelleneditor in einer JTable

8

Ich habe Probleme mit dem folgenden Code, wo ich eine JComboBox verwende, um einen String-Wert in einer Tabellenzelle zu ändern. Die JComboBox funktioniert gut, aber wenn ich in das Feld klicke und dann auf klicke, ohne etwas auszuwählen , bleibt das Dropdown-Menü der JComboBox sichtbar, selbst wenn ich die Zeile lösche. Wenn Sie wie bei einem JButton auf eine andere Swing-Komponente klicken, verschwindet sie oft, aber nicht immer.

%Vor%

Bearbeiten: Ich habe es versäumt zu erwähnen, dass ich früher eingestellt habe:

%Vor%

Wenn ich diese Zeile kommentiere oder sie falsch setze, dann bewirkt das Klicken auf andere Swing-Komponenten NICHT, dass die Box verschwindet. Wenn Sie darauf klicken, wird durch Klicken auf alles, was den Fokus betrifft, die Box entfernt, was das Problem weniger ärgerlich macht, aber möglicherweise die Ursache des Verhaltens maskiert.

Tue ich hier etwas falsch oder vergesse einen Schritt? Oder gibt es eine Möglichkeit, es zu zwingen, sich selbst zu schließen?

Danke!

    
John Murphy 18.02.2009, 16:42
quelle

2 Antworten

11

Um das zu verstehen, müssen Sie verstehen, was mit einer bearbeitbaren Tabelle passiert. Ein bisschen Theorie:

Jede Zelle hat einen potentiellen Renderer und Editor. Der Renderer teilt der Zelle lediglich mit, wie gezeichnet werden soll und interagiert nicht mit Ereignissen. Der Editor ist jedoch eine Komponente, die mit Ereignissen interagieren kann. Wenn ein Ereignis eintritt, das eine Bearbeitung auslöst, wird die Editorkomponente über der Tabelle hinzugefügt. Wenn die Bearbeitung abgeschlossen ist, wird die Komponente entfernt.

Damit die Komponente verschwindet, müssen Sie sicherstellen, dass sich die Zelle nicht im Status "Bearbeitung" befindet. Dies ist der Grund, warum terminateEditOnFocusLast das JComboBox zum Verschwinden bringt. Wenn Sie möchten, dass andere Dinge die Box verlassen, müssen Sie wahrscheinlich removeEditor () als Reaktion auf bestimmte Ereignisse, möglicherweise Fokus oder Zellauswahl aufrufen.

Um wirklich zu verstehen, was passiert, empfehle ich einen kurzen Blick auf den Quellcode zu removeEditor (), editCellAt () usw. und vielleicht einmal in einem Debugger. Es ist möglich, dass Sie einen Teil des Ereignisbehandlungscodes überschrieben haben oder ihn aufrufen, wenn dies nicht der Fall ist. Der Editor / Event-Handling-Code in JTable ist ziemlich zerbrechlich, und es ist ziemlich einfach, versehentlich Anrufe in der falschen Reihenfolge mit lustigen Nebenwirkungen zu erhalten.

Außerdem hat Java das Ereignis- und Fokusverhalten von JTable sehr subtil zwischen den Versionen geändert, ich glaube, es war zwischen 1.4 und 1.5, als sich die Fokusbehandlung für den Swing änderte. Das erste, was ich empfehlen kann, ist der Code mit einer anderen Java-Version. Der Fehler wurde möglicherweise von Sun verursacht (einige unserer komplizierten Editor-Codes mussten geändert werden) und wenn es zwischen den Versionen unterschiedlich ist, ist es einfacher, Sun zu melden.

    
Nick Fortescue 18.02.2009, 23:09
quelle
1

Ich weiß, dass diese Frage alt ist, aber als Referenz hier ist meine Lösung. Ich erweitere den DefaultCellEditor und höre auf das Abbrechen der JComboBox und erzwinge dann den Abbruch des Editors.

%Vor%

Dann ...

%Vor%     
BJ_ 05.02.2016 18:36
quelle

Tags und Links