SWT bardzo podstawy
Co to jest SWT?
No właśnie, co to jest? SWT jest wytworem chorej wyobraźni twórców Eclipsa. Pewnego pięknego dnia zapragnęli mieć oni bibliotekę tak szybką jak AWT i jednocześnie tak bogatą jak Swing. Wymyślili więc bardzo ciekawe rozwiązanie…
O AWT i Swingu
AWT jest najstarszą graficzną biblioteką w Javie. Ma ona jedną zaletę, a mianowicie jest szybka. Posiada coś takiego jak AWT Native Interface – JAWT. Napisany w C++, pozwalający na integrację z pewnymi elementami systemu. Z drugiej strony AWT jest bardzo ubogie. Nie ma wielu komponentów, a skomplikowane API utrudnia pisanie własnych.
Dlatego też programiści z Suna wpadli na „genialny” pomysł implementacji wszystkich elementów GUI bezpośrednio w Javie. Otrzymali w ten sposób Swinga, który ma wiele klas reprezentujących najprzeróżniejsze elementy graficzne, ale ma też dwa poważne błędy. Pierwszy z nich to potworna powolność. Bardziej skomplikowany interfejs zaczyna mulić, zżerać zasoby i wkurwiać użyszkodnika. Drugą wadą jest całkowite olanie Look’n’Feel systemu. Dostajemy zatem swingowe potworki graficzne.
AWT + Swing = SWT
Twórcy Eclipsa mając do wyboru ubogie AWT i powolnego Swinga poszli trzecią drogą. Założyli, że wszystkie elementy Swinga (znaczną większość w zasadzie), należy zaimplementować w C++ tak jak w AWT. Elementy, które nie mają swoich odpowiedników w danym systemie są emulowane. Prawda, że genialne?
Pierwszy program SWT
Tworzymy nowy projekt w Eclipsie i następnie do listy bibliotek dodajemy:
Listing 1. Biblioteka
eclipse/plugins/org.eclipse.swt.win32.win32.xxxxxx.jar
Lub inną odpowiednia dla danego systemu. Zamiast xxxxxx będzie ciąg cyferek, wybrać najnowszą wersję. W Eclipse 3.3 nie musimy już dodawać plików .dll z implementacją w C++, ponieważ pliki te są zaszyte w jarze.
Teraz wystarczy stworzyć kod:
Listing 2. Main
public class Main {
	public static void main(String[] args) {
		Display display = new Display();
		Shell shell = new Shell(display);
		shell.setText("dupa");
		shell.open();
		while (!shell.isDisposed())
			if (!display.readAndDispatch()) display.sleep();
		display.dispose();
	}
}
.. i jesteśmy w domu. Tylko zaraz czy ten kod czegoś nie przypomina?
Niestety tak. Obiekt Display odpowiada za połączenie pomiędzy SWT i systemem. Obiekt Shellodpowiada oknu głównemu aplikacji. Tworzymy więc połączenie pomiędzy naszym programem i systemem, tworzymy okno główne i…
Jak w Pascalu panie kochany, jak w Pascalu
… tworzymy pętle nasłuchującą komunikatów. Zastrzelić się można, ale problem ten jest do ominięcia dzięki delegowaniu zachowania. Przykładowy program rozbity na dwie klasy:
Listing 3. Main z pętlą
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class Main {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Display display = new Display();
		MyShell myShell = new MyShell();
		display.dispose();
	}
}
class MyShell {
	private Shell shell;
	private Display display;
	public MyShell() {
		display = Display.getCurrent();
		shell = new Shell(display);
		init();
		open();
		startEventLoop();
	}
	private void init() {
		shell.setText("dupa");
	}
	private void startEventLoop() {
		while (!shell.isDisposed())
			if (!display.readAndDispatch())
				display.sleep();
	}
	private void open() {
		shell.open();
	}
}
Jak widać nie dziedziczę po klasie Shell, a to dlatego, że się nie da.
To na dziś tyle. Następny tydzień muszę poświęcić na napisanie kilku przykładowych aplikacji JEE, więc do tego tematu wrócimy za dwa tygodnie. Zresztą tak jak i do Egg’a