[SWT] Komunikacja między okienkami

0

Witam,

Chciałbym napisać kod w którym będą dwa okienka i jak np. kliknę na przycisk w pierwszym to nastąpi jakaś zmiana w drugim np. wyświetli się jakiś tekst. Jak na razie udało mi się napisać coś co przekazuje do konstruktora referencje do pierwszego okienka i potem coś robi. Wygląda to mniej więcej:

class FirstWindow {
public Button bt1;
...
new SecondWindow(display, this); 
}

class SecondWindow {
private FirstWindow fw;
public SecondWindow(Display parent, FirstWindow fw) {
this.fw=fw;
init(); //jakaś inicjalizacja
}
public void setTekst() { // np. taka zmiana
if (fw!=null)
fw.bt1.setText("Nowy tekst");
}

W kodzie mogą być jakieś błędy bo pisze go "z palca"(oczywiście pomijam sporo kodu). Ale chodzi mi tylko o pokazanie koncepcji.
Tak więc taki zapis mi się osobiście nie podoba i zastanawiam się jakie są inne możliwości.

Z góry dziękuję za pomoc

Pozdrowienia
Marcin

0

Zastosuj MVC! Kazde okienko ma metode addClickListener, ktora przypisuje Listenera klikniecia, oraz metode np drawHello
Potem robisz klase Controller, ktorej podajesz oba skonstruowane metoda new okienka.
Controller rejestruje w nich listenery tak, ze jeden listener odpala drawHello drugiego okienka.

pozdrawiam

0

Witam,

Najwyraźniej nie do końca poprawnie przedstawiłem problem. Rozwiązanie które zostało podane w poprzednim poście wydaje się działać dla dwóch "niezależnych" okien, natomiast ja chciałbym najpierw w jednym oknie mieć przycisk tworzący drugie, a potem w tym drugim robić jakąś zmianę w pierwszym.
W sumie napisałem dwa rozwiązania tylko wciąż nie wiem czy są poprawne, albo które jest lepsze :)
Oto one:
Pierwsze

import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.SWT;

public class FirstWindow {
	Display display = new Display();
	Shell shell = new Shell(display);
	Text text;
	Button b;
	public FirstWindow() {
		shell.setText("Nazwa okna");
		shell.setMinimumSize(300, 400);
		shell.setLayout(new GridLayout());
		text = new Text(shell, SWT.None);
		text.setText("To jest swt.wigdets.text");
		/*
		 * to jest drugie okno otwierane w pierwszym
		 */
		class SecondWindow {	
			private Shell shellS;
			private Button button;
			public SecondWindow(Display parent) {
				shellS = new Shell(parent);
				shellS.setLayout(new FillLayout());
				init();
			}
			private void init() {
				button = new Button(shellS, SWT.NONE);
				button.setText("Zmień coś w TestGUI");	
				button.addListener(SWT.MouseDown, new Listener() {
					@Override
					public void handleEvent(Event event) {
						setText("TestGUI.SecondWindow.button"); // zmiana tekstu 
						shellS.dispose();
					}
				});
				shellS.pack();
				shellS.open();
			}
		}
		/*
		 * utworzenia nowego przycisu i zarejestrowanie listenera
		 */
		Listener list = new Listener() {
			@Override
			public void handleEvent(Event event) {
				new SecondWindow(display);
			}
		};
		b = new Button(shell, SWT.NONE);
		b.setText("Nowe okno");
		b.addListener(SWT.MouseDown, list);	
		shell.pack();
		shell.open();
		while( !shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
		display.dispose();
	}
	public void setText(String s) {
		text.setText(s);
	}
	public static void main(String[] args) {
		new FirstWindow();
	}
}

Drugie:

import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.SWT;

public class FirstWindow {
	private Shell shell;
	private Display display;
	private Text text;
	private Button button;
	public FirstWindow() {
		display = new Display();
		shell = new Shell(display);
		init();
	}
	private void init() {
		shell.setLayout(new GridLayout());
		button = new Button(shell, SWT.NONE);
		button.setText("Stwórz nowe okno");
		button.addListener(SWT.MouseDown, new Listener() {
			@Override
			public void handleEvent(Event event) {
				new SecondWindow(display, FirstWindow.this);
			}
		});
		text = new Text(shell, SWT.NONE);
		text.setText("FirstWindow.text");
		shell.pack();
		shell.open();
		while( !shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
		display.dispose();
	}
	public void setText(String s) {
		text.setText(s);
	}
	public static void main(String[] args) {
		new FirstWindow();
	}
}
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.*;

public class SecondWindow {
	private Shell shell;
	private FirstWindow fw;
	private Button button;
	public SecondWindow(Display display, FirstWindow fw) {
		shell = new Shell(display);
		this.fw=fw;
		init();
	}
	private void init() {
		shell.setLayout(new FillLayout());
		button = new Button(shell, SWT.NONE);
		button.setText("Zmien coś w FirstWindow");
		button.addListener(SWT.MouseDown, new Listener() {
			@Override
			public void handleEvent(Event event) {
				fw.setText("SecondWindow.button");
				shell.dispose();
			}
		});
		shell.pack();
		shell.open();
	}
}

Mam nadzieje że moderatorzy nie będą mieli mi za złe wklejanie dużej ilości kodu.

Z góry dziękuję za pomoc.

Pozdrowienia
Marcin

1 użytkowników online, w tym zalogowanych: 0, gości: 1