Swing CellEditor bei Fokusverlust Bearbeitung beenden?!

ElJarno

Bekanntes Mitglied
Hi Leute,
hab das generelle Problem, dass wenn ich den Wert im CellEditor(Tabelle) beabeite und dann auf ein Button klicke der Wert nicht übernommen wird. Erst wenn das CellEditing korrekt beendet wird, wenn man woanders in der Tabelle hinklickt wird der Wert übernommen. Hat jemand ne Lösung für dieses Problem, dass halt jegliche CellEditoren in der Tabelle beendet werden wenn man woanders hinklickt, egal wohin.

Gruß Jan
 
Jo den Tipp, hab ich auch gefunden, funktioniert auch wenn ch dann z.B in ein TxtField wechsle oder woanders fokussiere. Nur beim Betätigen von Buttons reagiert das immer noch nicht.
 
Mhm, anscheinend wird das nicht von jeder JRE unterstützt wie ich eben las (bei mir tuts 🙂 )
Was du aber noch machen könntest ist, im ActionListener des Buttons(den du ja vermutlich hast) so etwas wie
[c]table.getCellEditor().stopCellEditing();[/c] aufzurufen.
 
Ich hatte in der Tat auch das gleiche Problem. Meine ToolbarButtons haben den Editiervorgang auch nicht beendet, um haben dann ggfls. die View gewechselt und die Änderungen wurden nicht übernommen. Um das zu lösen, hab ich wie eRaaaa bereits beschrieben hat einfach:
Java:
table.getCellEditor().stopCellEditing();
in einer eigens dafür geschriebenen Action aufgerufen die andere Actionobjekte wrappen konnte. Wenn ich also vor Buttonklick erst prüfen wollte, ob in der Tabelle noch editiert wird, hab ich nen Konstrukt gebildet ala:

Java:
button.setAction( new StopCellEditingAction( new ChangeViewAction() ) );

Vielleicht nicht die eleganteste Lösung, aber ich fands sehr zweckmäßig und immer noch halbwegs gut nachzuvollziehen.
 
Ich vermute stark, dass es damit zusammenhängt, dass es zwei Arten von Fokus-Events gibt (mal von GAINED und LOST abgesehen), nämlich "normale" und "temporäre". Die temporären werden ausgelöst, wenn man z.B auf einen Button klickt, denn hier bekommt der Button für die Zeit des Klicks kurz den Fokus, welcher danach aber sofort wieder zurückspringt. Ich denke beim CellEditor werden solche temp. Events nichts behandelt.
Ich hatte zumindest vor einiger Zeit auch ähnliche Probleme, aber finde die Lösung spontan nicht mehr.
Vielleicht wäre folgender FocusListener auch einen Versuch wert:
Java:
meineTabelle.addFocusListener(new FocusAdapter()
{
    @Override
    public void focusLost( FocusEvent event )
    {
        CellEditor edt = meineTabelle.getCellEditor();
        if (edt != null)
        {
            edt.stopCellEditing();
        }   
    }
});
 
Die stopCellEditing() Methode in den ButtonActionListener aufzurufen ist mir auch schon in den Sinn gekommen, nur jetzt jeden Button mit diesen Einschub zu versehen war mit erst mal ein wenig mühselig, werd mir mal irgendwas praktisches ausdenken. Naja hätt ja sein können dass es einen ähnlichen trick wie
Java:
table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
dazu gäbe.

Danke für die Tipps

Gruß Jan
 

Neue Themen


Zurück
Oben