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!
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.