Page 1 of 1

Open Internal Frame

PostPosted: Wed Nov 14, 2018 2:44 pm
by hansemar
Hallo,

wir wollen ein Dialog-Fenster öffnen wenn die selektierte Zeile im Databook geändert wird um den User zu fragen ob die Änderungen gespeichtert werden oder verworfen sollen.

Folgenden Listener für das Event BeforRowSelected haben wir dafür geschrieben:

Code: Select all
private void checkAndAskToSaveChanges(DataBookEvent event) throws Throwable {   
       
        if(this.hasChanges()) {
            UIFormLayout askForSavePanelLayout = new UIFormLayout();
            UIPanel askForSavePanel = new UIPanel(askForSavePanelLayout);
            Dialog askForSaveDialog = new Dialog(askForSavePanel);
            UIButton discard = new UIButton("verwerfen", (eventVerwerfen) -> {
                zolltarifnummernDataBook.restoreSelectedRow();
                zolltarifnummernTextGermanDataBook.restoreSelectedRow();
                zolltarifnummernTextFrenchDataBook.restoreSelectedRow();
                zolltarifnummernTextEnglishDataBook.restoreSelectedRow();
                askForSaveDialog.doCancel();
                getApplication().close(askForSaveDialog);
            });
           
            askForSavePanel.add(discard);
           
            Dialog.openInternalFrame(this, "Test", true, askForSaveDialog);
        }
    }


Folgende Probleme haben sich dabei aufgetan:
  • Dialog.openInternalFrame(this, "Test", true, askForSaveDialog); liefert den Fehler, dass die Übergebenen Argumente nicht der Schnittstelle entsprechen (siehe angehängtes Bild). Dabei haben wir uns am Beispiel aus der Doku gehalten: http://doc.sibvisions.com/jvx/client/gui/custom_dialog
  • Wenn wir den Dialog mit openContent Aufrufen öffnet sich der Dialog aber der Workscreen wartet nicht auf die User Interaktion und die nächste Zeile wird selektiert.

Können Sie uns weiterhelfen, was wir falsch oder vergessen haben?

Gruß Mark

Re: Open Internal Frame

PostPosted: Wed Nov 14, 2018 3:57 pm
by rzenz
Moin.

Wie die Fehlermeldung vermuten laesst, erwartert openInternalFrame(...) eine IComponent, nicht einen ganzen Dialog. Also zum oeffnen muss man einfach askSavePanel uebergeben.

Das zweite ist etwas komplexer, die meisten GUI Technologien erlauben nicht das blocken des GUI Threads, aus dem simplen Grund weil dann ebenfalls die gesamte Nahrichten-Schleife ebenfalls geblockt waere, was es unmoeglich machen wuerde jemals wieder mit der GUI zu interagieren. Wenn man eine Operation verschieben will auf einen spaeteren Zeitpunkt, muss man dies in der Programlogik einbauen. Eine einfache Idee ist auf dem IDataBook den WritebackIsolationLevel auf DATASOURCE zu setzen. Damit werden Zeilen nur noch gespeichert wenn dies explizit vom Benutzer-Code aus passiert, also muss man sich dann sowohl um das speichern als auch um das verwerfen kuemmern.

Re: Open Internal Frame

PostPosted: Wed Nov 14, 2018 4:53 pm
by Support@SIB
Die Doku zum Thema Dialog.

Wir rzenz schon richtig sagte, ist das Blockieren keine gängige Lösung und würde im Web auch nicht funktionieren. Aber ganz einfach die Programmlogik dahingehend abändern, das die Ausführung im Listener passiert.

Re: Open Internal Frame

PostPosted: Wed Nov 14, 2018 4:56 pm
by Development@SIB
Das Problem mit dem Dialog ist nicht IComponent, da Dialog auch ein Content ist und daher auch IComponent. Das Problem ist das der erste Parameter die Application sein muss und nicht der WorkScreen!