# mehrere Fenster in SWT öffnen



## phyrexianer (15. Jun 2007)

hatte zwar schon einen Post.. aber irgendwie konnte ich da wohl das Problem nicht richt darstellen.... habe hier jetzt einen Versuch mit 2 Fenster und dem zughörigen Code.... vielleicht könnt ihr mir dabei eher helfen???

Window1.class

```
package opc.test;

import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;

public class Window1 {

	private Shell sShell = null;
	private Button button = null;

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		/* Before this is run, be sure to set up the launch configuration (Arguments->VM Arguments)
		 * for the correct SWT library path in order to run with the SWT dlls. 
		 * The dlls are located in the SWT plugin jar.  
		 * For example, on Windows the Eclipse SWT 3.1 plugin jar is:
		 *       installation_directory\plugins\org.eclipse.swt.win32_3.1.0.jar
		 */
		Display display = Display.getDefault();
		Window1 thisClass = new Window1();
		thisClass.createSShell();
		thisClass.sShell.open();

		while (!thisClass.sShell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
		display.dispose();
	}

	/**
	 * This method initializes sShell
	 */
	private void createSShell() {
		GridData gridData = new GridData();
		gridData.horizontalAlignment = GridData.FILL;
		gridData.grabExcessHorizontalSpace = true;
		gridData.verticalAlignment = GridData.CENTER;
		sShell = new Shell();
		sShell.setText("Shell");
		sShell.setSize(new Point(300, 200));
		sShell.setLayout(new GridLayout());
		button = new Button(sShell, SWT.NONE);
		button.setText("Open Window2");
		button.setLayoutData(gridData);
		button.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
			public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
				System.out.println("widgetSelected()"); // TODO Auto-generated Event stub widgetSelected()
			new Window2();
			
			}
		});
	}

}
```


Window2.class

```
package opc.test;

import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Label;

public class Window2 {

	private Shell sShell = null;
	private Button button = null;
	private Label label = null;
	private Button button1 = null;

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		/* Before this is run, be sure to set up the launch configuration (Arguments->VM Arguments)
		 * for the correct SWT library path in order to run with the SWT dlls. 
		 * The dlls are located in the SWT plugin jar.  
		 * For example, on Windows the Eclipse SWT 3.1 plugin jar is:
		 *       installation_directory\plugins\org.eclipse.swt.win32_3.1.0.jar
		 */
		Display display0 = Display.getDefault();
		Window2 thisClass = new Window2();
		thisClass.createSShell();
		thisClass.sShell.open();

		System.out.println("main wird aufgerufen");
		
		while (!thisClass.sShell.isDisposed()) {
			if (!display0.readAndDispatch())
				display0.sleep();
		}
		display0.dispose();
	}

	/**
	 * This method initializes sShell
	 */
	private void createSShell() {
		GridData gridData = new GridData();
		gridData.horizontalAlignment = GridData.FILL;
		gridData.grabExcessHorizontalSpace = true;
		gridData.verticalAlignment = GridData.CENTER;
		sShell = new Shell();
		sShell.setText("Shell");
		sShell.setSize(new Point(300, 200));
		sShell.setLayout(new GridLayout());
		button = new Button(sShell, SWT.NONE);
		button.setText("Open 2nd Window");
		button.setLayoutData(gridData);
		label = new Label(sShell, SWT.NONE);
		label.setText("Fenster ist Offen ");
		button1 = new Button(sShell, SWT.NONE);
		button1.setText("Schließen");
		button1.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
			public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
				System.out.println("widgetSelected()"); // TODO Auto-generated Event stub widgetSelected()
			Shell s = e.display.getActiveShell();
			s.close();
			
			}
		});
		button.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
			public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
				System.out.println("widgetSelected()"); // TODO Auto-generated Event stub widgetSelected()
			}
		});
	}

}
```


die Window*.class laufen unabhänging voneinander und ich kann die Starten aber ich kann nicht durch das erzeugen einer neuen "new Windows2()" kein zweites fesnter erzeugen nur wenn ich zusätzlich noch "new Windwos2().main(null)" aufrufe also die Mainmethode....

aber warum muss ich noch die Mainmethode aufrufen diese sollte doch automatisch aufgerufen werden wenn ich eine Instanz des Windwos2 objekt erstelle was ich ja mit "new Window2()" ja mache !?!


----------



## trazzag (15. Jun 2007)

Ein Aufruf von "new Window2()" ruft den Konstruktor und nicht die Main-Methode auf.
Überschreibe mal den Standard-Konstruktor und pack da alles rein, was jetzt in deiner Main steht. In der Main rufst du dann nur noch nen Konstruktor auf.
Falls dein Window2 gar nicht unabhängig von deinem ersten Fenster (als seperate Anwendung) laufen muß / soll, lass die Main ganz weg!


----------



## phyrexianer (15. Jun 2007)

ok.... 
um das jetzt richtig zu verstehen, wann wird denn die "mainMethode" aufgerufen ???


----------



## trazzag (15. Jun 2007)

Also, bei allem Verständnis, aber dir scheinen wirklich die elementarsten Grundlagen zu fehlen. Vielleicht solltest du erstmal ein paar kleiner Anwendungen programmieren, bevor du dich mit GUI-Entwicklung samt mehrer Fenster auseinandersetzt.

Dennoch bezüglich der Main: Lies mal hier

Und hier und hier findest du was über den Konstruktor.


----------



## phyrexianer (16. Jun 2007)

danke.... aber das kenne ich auch schon alles.... nur das mit der MAIN ging bzw.  geht mir noch nicht so 100% rein..... wann wie diese benutzt wird... also das wenn ich eine Anwendung habe mindestens eine MAIN brauche ist mir klar bzw. eine Klasse die eine MAIN-Methode enthält, da diese von der VM aufgerufen wird. Dachte aber das die Main aufgerufen wird wenn eine neue Instanz erzeugt wird. Dass der Konstruktor aufgerufen wird ist mir schon klar... hab da wohl nicht weiter gedacht bzw. was durcheinander gewürfelt....    

Werd mal schaue wo ich noch Infos bekomme .... aber vielen Dank habe das Prob denke ich jetzt verstanden ! ;-)


----------

