SWT Dialog in Dialog automatisch öffnen

JasDA

Aktives Mitglied
Ich habe einen TitleAreaDialog, in dem es einen Button gibt, um einen zweiten Dialog zu öffnen. So weit, so gut. Aber wie bekomme ich es hin, dass der zweite Dialog automatisch geöffnet wird NACHDEM der erste geöffnet wurde?

In der createDialogArea() gehts leider nicht, da dann nur der zweite geöffnet wird und der erste wird erst nach dessen Schließen wieder angezeigt.
 
wenn du auf beiden Dialogs
Code:
setVisible(true)
aufrufst und nichts mit der Methode
Code:
setModal(boolean b)
machst, werden dir auch beide angezeigt.

ansonsten zeig ein KSKB
 
Genau das ist der Punkt. Beide sollen modal sein und deshalb wird der erste Dialog nicht angezeigt bevor der zweite geschlossen wurde. Deshalb suche ich ja nach einer "afterDialogOpen"-Methode. Es muss doch möglich sein auf das Öffnen des Dialogs reagieren zu können?
 
das geht aber nicht, dass du 2 modale Diaolgs gleichzeitig hast...das ist doch der Sinn von modalen Dialogen.

Ein modaler Dialog verhindert Eingaben in dem aufrufenden Fenster, bis der Dialog beendet wird!
 
Ich glaube wir reden aneinander vorbei. Ich kann in einem modalen Dialog sehr wohl einen anderen modalen Dialog öffnen. Dann hat dieser neu geöffnete den Focus und der andere wird im Hintergrund angezeigt.

Wie gesagt, es funktioniert von Hand ja wunderbar. Ersten Dialog öffnen --> auf Button klicken --> zweiter Dialog öffnet sich und der erste ist weiterhin im Hintergrund zu sehen.

Und genau diesen Button Klick möchte ich automatisieren.
 
wenn du den Button hast und auf Klick das genauso macht wie du willst, warum rufst du dann nicht einfach doClick() auf den Button auf?
 
Lies mal den ersten Beitrag von mir ;-)

Hier aber mal ein Beispiel damit es verständlicher wird. Den Klick auf den Button in Dialog1 möchte ich beim Öffnen von Dialog1 automatisch ausführen.

Java:
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;

public class DialogExample extends ApplicationWindow {

  public DialogExample(Shell parentShell) {
    super(parentShell);
  }

  protected Control createContents(Composite parent) {
    Composite composite = new Composite(parent, SWT.NULL);

    composite.setLayout(new GridLayout());

    final Button btnOpenDialog = new Button(composite, SWT.PUSH);
    btnOpenDialog.setText("Dialog öffnen");
    btnOpenDialog.addListener(SWT.Selection, new Listener() {
      public void handleEvent(Event event) {
    	  new Dialog1(getParentShell()).open();
      }
    });

    return super.createContents(parent);
  }
  

  public static void main(String[] args) {
    ApplicationWindow window = new DialogExample(null);
    window.setBlockOnOpen(true);
    window.open();
  }
  
  
  class Dialog1 extends TitleAreaDialog 
  {
	public Dialog1(Shell parentShell) {
		super(parentShell);
	}
	  
	@Override
	protected Control createContents(Composite parent) {
		Label label = new Label(parent, SWT.NONE);
		label.setText("Dies ist Dialog 1");
		
		Button btnOpenDialog2 = new Button(parent, SWT.PUSH);
		btnOpenDialog2.setText("Dialog 2 öffnen");
	    btnOpenDialog2.addListener(SWT.Selection, new Listener() {
	        public void handleEvent(Event event) {
	      	  new Dialog2(getParentShell()).open();
	        }
	      });
		return parent;
	}		
  }
  
  
  class Dialog2 extends TitleAreaDialog 
  {
	public Dialog2(Shell parentShell) {
		super(parentShell);
	}
	  
	@Override
	protected Control createContents(Composite parent) {
		Label label = new Label(parent, SWT.NONE);
		label.setText("Dies ist Dialog 2");
		return parent;
	}		
  }
}
 
Zur Problemlösung kann ich nichts beitragen, aber:

jgh bezieht sich aber auf das Swing

hier geht es aber um SWT
OK, hätte ich eine Minute gewartet, hatte man es am Code feststellen können ;-)

Hab grad kein SWT bzw. kein JFace zur Hand und mehr als ein paar Tests habe ich nie damit gemacht. Kann man die open() Methode überschreiben, um darin den zweiten Dialog anzeigen zu lassen?

Wobei sich ein Dialog der automatisch einen zweiten Dialog öffnet, schon fast nach Anwenderfolter anhört ;-)
 
In der open-Methode hatte ich es auch versucht, geht aber leider nicht ohne sie komplett neu zu schreiben.

Das mit der Anwenderfolter musst du mir nicht sagen, die Anforderung kommt explizit von unseren Anwendern. Bei Massenverarbeitung ist jeder zusätzliche Mausklick schon ein Klick zuviel.
 
Hmm,

ich bin nun auch nicht mit SWT vertraut, aber wenn das Problem daher rührt, dass beide Dialoge modal sind und du den 2. Dialog ja sowieso automatisch öffnest, dann genügt es in diesem Moment ja auch, wenn Dialog Nr. 2 modal ist, weil du an Nr. 1 ja eh nicht dran kommst.
Wenn Nr. 2 geschlossen wird, kannste Nr. 1 ja modal setzen.

Wie gesagt ob´s hilft weiss ich nicht, ist halt nur ein Gedanke.

Gruß Vanny

//Edit:
Ansonsten verzichte einfach auf den zweiten Dialog, nimm ein CardLayout und wechsle einfach die Seite😉
 
Zuletzt bearbeitet von einem Moderator:
Ich hab gerade mal ein wenig mit dem Modal rumgespielt:

Java:
setShellStyle(SWT.TITLE | SWT.MODELESS | SWT.CLOSE);

Das Modal ist aber anscheinend nicht das Problem. Es wird immer nur einer der beiden Dialoge angezeigt, da der Code ja erstmal an der Stelle "steht" an dem ein Dialog geöffnet wird und praktisch erst weiter läuft, wenn der Dialog geschlossen wird.
 
Ich habe es soweit hinbekommen, wenn man den Dialog in einem extra Thread in der createContents() öffnet. Ist nur die Frage ob damit auch sichergestellt ist, dass Dialog2 immer im Vordergrund ist?

Java:
    	Display.getCurrent().asyncExec(new Runnable() {
    	    @Override
    	    public void run() {
    	    	new Dialog2(getParentShell()).open();
    	    }
    	});
 
Ich habe es soweit hinbekommen, wenn man den Dialog in einem extra Thread in der createContents() öffnet. Ist nur die Frage ob damit auch sichergestellt ist, dass Dialog2 immer im Vordergrund ist?

Java:
    	Display.getCurrent().asyncExec(new Runnable() {
    	    @Override
    	    public void run() {
    	    	new Dialog2(getParentShell()).open();
    	    }
    	});

Weißt du auch warum du einen extra Thread brauchst???

Mach mal einen Sysout hier rein und schau wann du die Ausgabe siehst

Java:
    btnOpenDialog.addListener(SWT.Selection, new Listener() {
      public void handleEvent(Event event) {
          new Dialog1(getParentShell()).open();
System.out.println("Weiter gehts";)
      }
    });
 
Zuletzt bearbeitet von einem Moderator:
So,

1. es ist bei SWING genau das gleiche Verhalten, hab es mal ausprobiert.(die Idee mit dem neuen Thread hatte ich auch😉).

2. ist dieses Dialog-Geballer in meinen Augen nicht schön gelöst. Ich denke mit nur einem modalen Dialog und einem CardLayout fährst du da echt besser, und der User wird nicht mit irgendwelchen Fenstern zugeschmissen. Zudem kannst du dann sicher sein, dass der User auch wirklich sieht, was er sehen soll.

Gruß Vanny
 
Der Kunde will natürlich mal wieder die Quick&Dirty Lösung. Ich finde es selbst ja auch überhaupt nicht schön. Werde aber mal in einer ruhigen Minute deinen Vorschlag mit dem CardLayout ausprobieren. Auf jeden Fall erstmal Danke.
 
Der Kunde will natürlich mal wieder die Quick&Dirty Lösung. Ich finde es selbst ja auch überhaupt nicht schön. Werde aber mal in einer ruhigen Minute deinen Vorschlag mit dem CardLayout ausprobieren. Auf jeden Fall erstmal Danke.

CardLayout ist Swing

Schau mal hier:
Mit
Code:
btnOpenDialog2.notifyListeners(SWT.Selection, new Event());
kannst du einen programmtischen klick ausführen. Natürlich nachdem dein listener registriert wird.


Java:
  class Dialog1 extends TitleAreaDialog 
  {
    public Dialog1(Shell parentShell) {
        super(parentShell);
    }
      
    @Override
    protected Control createContents(Composite parent) {
        Label label = new Label(parent, SWT.NONE);
        label.setText("Dies ist Dialog 1");
       
        Button btnOpenDialog2 = new Button(parent, SWT.PUSH);
       
        btnOpenDialog2.setText("Dialog 2 öffnen");
        btnOpenDialog2.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event event) {
              new Dialog2(getParentShell()).open();
            }
          });
        btnOpenDialog2.notifyListeners(SWT.Selection, new Event());
        return parent;
    }       
  }
 

Neue Themen


Zurück
Oben