This website uses cookies for visitor traffic analysis. By using the website, you agree with storing the cookies on your computer.More information

Open Internal Frame

Allgemeine Fragen zur Entwicklung von und mit JVx.

Open Internal Frame

Postby hansemar » Wed Nov 14, 2018 2:44 pm

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
Attachments
Dialog_test.jpg
Dialog_test.jpg (77.66 KiB) Viewed 24752 times
hansemar
 
Posts: 15
Joined: Tue Jun 26, 2018 10:46 am

Re: Open Internal Frame

Postby rzenz » Wed Nov 14, 2018 3:57 pm

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.
User avatar
rzenz
 
Posts: 36
Joined: Mon Dec 12, 2016 1:40 pm
Location: Vienna, Austria

Re: Open Internal Frame

Postby Support@SIB » Wed Nov 14, 2018 4:53 pm

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.
User avatar
Support@SIB
 
Posts: 353
Joined: Mon Sep 28, 2009 1:56 pm

Re: Open Internal Frame

Postby Development@SIB » Wed Nov 14, 2018 4:56 pm

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!
User avatar
Development@SIB
 
Posts: 325
Joined: Mon Sep 28, 2009 1:54 pm


Return to Development (DE)