IBM, eclipse projesine başladığında Swing kütüphanesinin performans açısından düşündükleri tarzda bir IDE oluşturmak için yeterli olmadığına karar verdi. Bu yüzden yeni bir GUI kütüphanesi yazdılar(SWT). Bu yeni kütüphanede çalışan kod yerel kod olduğu için performans açısından büyük bir kazanım oldu. Her işletim sistemi için SWT’nin özelleştirilmesi ile de platformdan bağımsızlık sağlandı. Drag&Drop gibi işletim sistemine özgü yeteneklerden direk yararlanma imkanı doğdu.
SWT sayesinde elde edilenler:
- Performans: Çalışan uygulamalar sanki çalıştırıldığı işletim sistemi için hazırlanmış gibi hızlı çalışabildiler.
- Uyumluluk: SWT ile hazırlanmış uygulamalar herhangi bir eklemeye gerek duymadan işletim sisteminin görünümü alabileceklerdi. Swing uygulamaları da Look&Feel desteği içermekte ama bu görünümler önceden hazırlanmış kütüpheneler halinde. Eğer kullanıcı WindowBlind gibi üçüncü parti yazılımlarla işletim sisteminin görünümünü değiştirirse, swing uygulamaları buna tepki veremez ama SWT uygulamaları bu değişikliği anında yansıtır.
Swing’in en beğenilen tarafı ise MVC (Model-View-Controller) tasarım şablona bağlı kalınarak hazırlanmış olmasıydı. SWT ise Olay tabanlı (Event based) bir kütüphane olmuştu. Oluşturulan nesneler sistem kaynaklarını kullanıyor bu yüzden yok edildiklerinde ise dispose metodu ile bu kaynakların işletim sistemine geri verilmesi gerekiyordu. Basit bir pencere açmak için bir ton kod yazmak gerekiyor,
Swingde Garbage collector’un yaptığı işler ise programlayana bırakılıyordu.
import org.eclipse.swt.widgets.*;
public class MainWindow {
public MainWindow() {
final Display display = new Display();
Shell shell = new Shell(display);
shell.setText("Main Window");
shell.setBounds(100,100,400,400);
shell.open();
// Even Loop - Olay döngüsü
while(!shell.isDisposed()) {
display.readAndDispatch();
}
display.dispose(); // iş bittikten sonra yoket
}
public static void main(String[] args) {
MainWindow mw = new MainWindow();
}
}
Bu noktada programcılara yardımcı olması ve Eclipse geliştirilken oluşabilecek bir kaosu önlemek için yardımcı bir kütüphane oluşturuldu (JFace)
JFace, MVC ayrımını yapan bir çok sınıftan oluşturulmuş bir kütüphanedir.
Yukarıdaki örneği JFace kullanarak şu şekilde yazmak mümkün:
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class MainWindow2 extends ApplicationWindow {
public MainWindow2() {
super(null);
}
@Override
protected void configureShell(Shell shell) {
super.configureShell(shell);
shell.setText("Main Window 2");
}
@Override
protected Point getInitialLocation(Point initialSize) {
return new Point(100,100);
}
@Override
protected Point getInitialSize() {
return new Point(400,400);
}
public static void main(String[] args) {
MainWindow2 mw2 = new MainWindow2();
mw2.setBlockOnOpen(true);
mw2.open();
Display.getCurrent().dispose();
}
}
JFace’in belli başlı kazanımları
- Action ve Contribution: Kullanıcı ile iletişim sağlanması sırasında aynı kodun tekrar tekrar yazılması yerine merkezi bir kontrol tabakası oluşturmak için gerekli sınıflar. Mesela kullanıcının, bir menü öğesini seçmesi veya bir düğmeye tıklaması gibi işlemler ilişkilendirilmiş Action sınıfa yönlendiriliyor.
- Dialog ve Wizard Pencereleri: Uygulamalarda çok kullanılan belli tip pencereler sınıflar haline getirildi. TitleAreaDialog, MessageDialog, ErrorDialog vb..
- Viewerlar: TreeView ve Table gibi widgetlar için Model oluşturulmasına olanak tanıyan sınıflar eklendi. TreeViewer, TableViewer vb.