Frage

Ich habe Probleme mit dem folgenden Code, bei dem ich ein JCombobox verwende, um einen Stringwert in einer Tabellenzelle zu ändern. Der jcombobox funktioniert gut, aber wenn ich in das Feld klicke und dann wegklicke ohne etwas auszuwählen Die Dropdown -Downser des JCombobox bleibt sichtbar, auch wenn ich die Zeile lösche. Wenn Sie auf eine andere Swing -Komponente wie ein Jbutton klicken, verschwindet sie oft, aber nicht immer.


    TableColumn col = myTable.getColumnModel().getColumn(0);
    JComboBox eq = new JComboBox();
    eq.addItem("==");
    eq.addItem("!=");
    DefaultCellEditor editor = new DefaultCellEditor(eq);
    col.setCellEditor(editor);

EDIT: Ich hatte es versäumt zu erwähnen, dass ich früher festgelegt habe:


    myTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);

Wenn ich diese Zeile kommentiere oder falsch einstellte, dann verschwindet das Klicken auf andere Schwungkomponenten nicht. Wenn Sie auf alles klicken, was den Fokus nimmt, wird die Box verschwinden, was das Problem weniger ärgerlich macht, aber möglicherweise die Ursache des Verhaltens maskiert.

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

Vielen Dank!

War es hilfreich?

Lösung

Um dies zu verstehen, müssen Sie verstehen, was mit einer bearbeitbaren Tabelle vor sich geht. Ein kurzes Stück Theorie:

Jede Zelle hat einen potenziellen Renderer und Herausgeber. Der Renderer sagt der Zelle nur, wie sie zeichnet und nicht mit Ereignissen interagiert. Der Editor ist jedoch eine Komponente, die mit Ereignissen interagieren kann. Wenn ein Ereignis stattfindet, das eine Bearbeitung auslöst, wird die Editor -Komponente oben auf der Tabelle hinzugefügt. Wenn die Bearbeitung beendet ist, wird die Komponente entfernt.

Damit die Komponente verschwinden kann, müssen Sie sicherstellen, dass sich die Zelle noch nicht im "Bearbeitungs" -Zustand befindet. Aus diesem Grund verschwindet das JCombobox -Verschwinden von TerminateDitonFocusLast. Wenn Sie möchten, dass andere Dinge die Box verlaufen, müssen Sie den REMEDEDITOR () wahrscheinlich als Antwort auf bestimmte Ereignisse, möglicherweise Fokus oder Zellenauswahl anrufen.

Um wirklich in den Griff zu bekommen, was passiert, würde ich empfehlen, einen kurzen Blick auf den Quellcode zu REMEDEDITOR (), editCellat () usw. zu sehen und vielleicht einmal in einem Debugger durchzusetzen. Es ist möglich, dass Sie einen Teil des Ereignisabwicklungscodes überschrieben haben oder ihn anrufen, wenn Sie dies nicht sollten. Der Redakteur-/Event -Handling -Code in JTable ist ziemlich zerbrechlich und es ist zufällig ganz einfach, Anrufe in der falschen Reihenfolge mit lustigen Nebenwirkungen zu erhalten.

Außerdem hat Java das Ereignis und das Fokusverhalten von JTable einmal zwischen den Versionen sehr subtil geändert. Ich denke, es lag zwischen 1,4 und 1,5, als sich die Fokushandhabung für Swing änderte. Das erste, was ich empfehlen würde, ist Ihr Code mit einer anderen Java -Version. Der Fehler wurde möglicherweise durch die Sonne verursacht (einige unserer komplizierten Editor -Code mussten geändert werden), und wenn er sich zwischen den Veröffentlichungen unterscheidet, ist es einfacher, sich der Sonne zu melden.

Andere Tipps

Ich weiß, dass diese Frage alt ist, aber hier ist meine Lösung. Ich erweitere den StandardCelleditor und höre auf, bis die JComBobox abgesagt werden soll und dann den Editor zum Abbrechen zwinge.

import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;

public class ComboBoxCellEditor extends DefaultCellEditor {

    public ComboBoxCellEditor(JComboBox comboBox) {
        super(comboBox);
        comboBox.addPopupMenuListener(new PopupMenuListener() {

            public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
            }

            public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
            }

            public void popupMenuCanceled(PopupMenuEvent e) {
                cancelCellEditing();
            }
        });
    }
}

Dann ...

DefaultCellEditor editor = new ComboBoxCellEditor(combobox);
column.setCellEditor(editor);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top