JOptionPane in FocusListener, Problem



  • Ich habe ein JTextField. Sollte es den Fokus verlieren und nicht leer sein, möchte ich den User einen "Wirklich nicht verwenden?"-Ja/Nein-Dialog zeigen. Dies erledige ich in einem FocusListener.

    Nun das Problem: Das JTextField verliert meistens den Fokus weil in einem anderen Bereich der Anwendung in einer JList ein anderes Element ausgewählt wird (was zur Folge haben sollte, dass ein ListSelection-Listener ausgeführt werden sollte). Leider übernimmt die JOptionPane aus irgendeinem Grund so den Fokus (meine Annahme: weil modal), so dass dieser ListSelection-Listener dann NICHT durchgeführt wird (sehr wohl aber ist das neu angeklickte JList-Element selektiert...).

    Dies darf nicht passieren, gibt es dafür einen workaround? Ich könnte für die Abfrage einen nicht-modalen Dialog verwenden, allerdings habe ich dann das Problem, dass der ListSelection-Listener evtl. VOR meiner Abfrage ausgeführt wird, was auch auf keinen Fall sein darf.

    Hoffentlich hat jemand einen Tipp für mich.

    MfG SideWinder



  • Eh, wenn mir eine Software modale Dialoge öffnet, wenn ich in Textfeldern rumklicke war das das letzte Mal dass ich von dem Entwickler was installiere. Das ist Problem Nummer 1.

    Wenn die korrekte Funktion von deinen Listenern von ihrer Ausführungsreihenfolge abhängt liegt in deinem Code wohl einiges im Argen. Das ist Problem Nummer 2.

    Wenn du beide Problem mal löst klärt sich wahrscheinlich auch die Frage, die ich jetzt auch nach 3 Mal Durchlesen nicht kapiert hab, sorry. :schland: :schland: :schland:



  • Das ist eine andere Situation als "gewöhnlich", also nicht dieses "keine korrekte Eingabe, sie dürfen dieses Feld nicht mehr verlassen"-Syndrom!

    Kurz zur Erläuterung: Es gibt Objekte, die werden in einer Liste angezeigt. Klicke ich ein Objekt an wird mir dazu ein InfoPanel angezeigt, u.a. mit einem Kommentarfeld. Dieser Kommentar wird teilweise sehr exzessiv bearbeitet (JTextArea) und wird über einen Button (Save) gespeichert.

    Nun haben einige Leute vergessen den Kommentar zu speichern und schwupps ist nach Auswahl eines anderen Listenobjekts der Kommentar verschwunden. Also sollen wir nun bei Aktivierung eines anderen Objektes (u.a. über die Liste aber auch anders möglich) nachfragen ob der Kommentar (falls verändert) in die Datenbank gespeichert werden soll oder nicht.

    Da ich nicht im Vorhinein weiß welche Möglichkeiten es alle gibt ein neues Element anzuzeigen (bzw. in manchen Fällen bleibt das InfoPanel mit dem Kommentar auch ganz leer) + weil ich möchte, dass der Bezug zur Änderung direkt hergestellt werden kann möchte ich diese Abfrage (Wollen Sie wirklich nicht speichern?) unmittelbar *nach* Verlassen des Feldes ausführen.

    Wann wurde das Feld verlassen? -> FocusListener
    Abfrage selbst -> JOptionPane

    Ablauf:
    - Falls Kommentar wird Abfrage angezeigt
    - Je nach Ergebnis wird gespeichert oder nicht
    - In jedem Fall soll nach der Bestätigung aber die vom User ursprünglich gewünschte Aktion (bspw. Infos zu anderem Element anzeigen) durchgeführt werden.

    Da eine JOptionPane aber leider ein modaler Dialog ist und die Abfolge scheinbar so ist:

    1. In JList wird neues Element selektiert (visuell sofort sichtbar)
    2. Altes Element bekommt daher FocusEvent, JOptionPane wird geöffnet
    3. JOptionPane ist modal
    4. ListSelectionEvent kommt bei der JList nie an

    Nun möchte ich (4) verhindern, das geht bspw. dadurch, dass ich einen nicht-modalen Dialog verwende, das möchte ich aber auch nicht, ich möchte ja, dass das Programm quasi hängt bis der User netweder Speichern oder Verwerfen ausgewählt hat.

    Jetzt klar was ich möchte? Wenn das auch ein Usability-Schrott ist dann her mit deinen Alternativen. Ich werde sie sehr gerne dem Auftraggeber vorschlagen. Aber wir haben auch schon mitgedacht (also soetwas wie Kommentaränderung verwerfen als Button und sonst immer Speichern, etc. ist nicht möglich)

    MfG SideWinder



  • Hab Problem jetzt verstanden.
    Sag mal in deiner focusLost Methode:
    list.setValueIsAdjusting(false);

    SideWinder schrieb:

    soetwas wie Kommentaränderung verwerfen als Button und sonst immer Speichern, etc. ist nicht möglich

    Wieso nicht, "Speichern" Buttons sind 90er, hab lang keine (neue) Software mehr mit so einem Knopf gesehen.



  • Weil aus preislichen Gründen entschieden wurde in dieser Software kein Undo/Redo-System einzubauen (ist auch nicht wirklich nötig). Demzufolge bleibt bei so großen User-Änderungen nur diese Möglichkeit, oder?

    @list-Adjusting: Das ist leider nicht möglich, ich weiß nicht ob das Objekt genau in dieser Liste ausgewählt wurde, es gibt da verschiedenste Möglichkeiten (die vollständige Menge ist nicht unbedingt bekannt).

    MfG SideWinder


Log in to reply