SWT: Inhalt einer Shell dynamisch verändern

tillsch

Grünschnabel
Hallo,

ich starte gerade die ersten Gehversuche mit SWT und bin auf ein Problem gestoßen, bei dem ich nicht weiter weiß:

Vom Konstruktor meiner Klasse rufe ich die methode test1 auf, welches auf die Klassenvariable shell einen Button anlegt. Der Button reagiert auf Klicken, in dem er sich sich selbst löscht (mit button.dispose()) und die Methode test2 aufruft. Diese verhilft der Shell zunächst zu einem neuen Layout und soll nach dem gleichen Prinzip einen Button erstellen, der sich durch Anklicken selber entfernt und in Methode test1 wechselt.
Ähnlich müsste auch ein Wizard funktionieren.
Kurz zusammengefasst: Ich möchte ein kleines SWT-Programm erstellen, dass den Inhalt der shell ändert.

Leider funktioniert das Programm nicht so wie gedacht: Sobald ich den Button aus test1 anklicke, verschwindet dieser zwar, jedoch wird kein neuer gezeichnet.
Wo liegt mein Fehler?

Grüße,
Tilmann
 
Wie sieht denn der Code aus?
Wird die Methode aufgerufen?
Da würde es bestimmt einige Möglichkeiten geben, warum es nicht geht...
 
Danke erst mal für die Antwort! So, ich hab das jetzt alles mal aufgeschrieben und getestet. Hier erst mal der Code:

Code:
import org.eclipse.swt.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.events.*;

public class DynamicShell {

	private Display display;
	private Shell shell;
	private Button button1;
	private Button button2;

	public DynamicShell() {
		display = new Display();
		shell = new Shell(display);
		shell.setText("DynamicShell-Test");
		shell.setMinimumSize(200,150);
		shell.pack();
		test1();
		shell.open();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch()) {
				display.sleep();
			}
		}
	}
	
	private void test1() {
		System.out.println("Aufruf von test1()");
		shell.setLayout(new FillLayout());
		button1 = new Button(shell,SWT.PUSH);
		button1.setText("gehe in test2()");
		button1.addSelectionListener(new SelectionAdapter() {
				public void widgetSelected(SelectionEvent e) {
					button1.dispose();
					System.out.println("button1 disposed ...");
					test2();
				}
			}	
		);
	}

	private void test2() {
		System.out.println("Aufruf von test2()");
		shell.setLayout(new FillLayout());
		button2 = new Button(shell,SWT.PUSH);
		button2.setText("gehe in test1()");
		button2.addSelectionListener(new SelectionAdapter() {
				public void widgetSelected(SelectionEvent e) {
					button2.dispose();
					System.out.println("button2 disposed ...");
					test1();
				}
			}	
		);
	}

	public static void main(String[] args) {
		new DynamicShell();
	}
}

Die Methode test2 wird aufgerufen, jedoch erscheint leider kein Button, was ich nicht verstehe. Der Fehler muss quasi in den Zeilen
Code:
		shell.setLayout(new FillLayout());
		button2 = new Button(shell,SWT.PUSH);
liegen. Ich bin jetzt leider mit meinen Latei am Ende ...
 
Hallo,

schau mal hier:
Java:
package de.tutorials;
import org.eclipse.swt.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.events.*;

public class DynamicShell {

    private Display display;
    private Shell shell;
    private Button button1;
    private Button button2;

    public DynamicShell() {
        display = new Display();
        shell = new Shell(display);
        shell.setText("DynamicShell-Test");
        shell.setMinimumSize(200,150);
        shell.pack();
        test1();
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
    }
    
    private void test1() {
        System.out.println("Aufruf von test1()");
        shell.setLayout(new FillLayout());
        button1 = new Button(shell,SWT.PUSH);
        button1.setText("gehe in test2()");
        button1.addSelectionListener(new SelectionAdapter() {
                public void widgetSelected(SelectionEvent e) {
                    button1.dispose();
                    System.out.println("button1 disposed ...");
                    test2();
                    shell.layout();
                }
            }    
        );
    }

    private void test2() {
        System.out.println("Aufruf von test2()");
        shell.setLayout(new FillLayout());
        button2 = new Button(shell,SWT.PUSH);
        button2.setText("gehe in test1()");
        button2.addSelectionListener(new SelectionAdapter() {
                public void widgetSelected(SelectionEvent e) {
                    button2.dispose();
                    System.out.println("button2 disposed ...");
                    test1();
                    shell.layout();
                }
            }    
        );
    }

    public static void main(String[] args) {
        new DynamicShell();
    }
}
Dir fehlte nur ein shell.layout();

Gruß Tom
 
Zurück