Eclipse’e Swing eklentisi kurma ve örnek Swing uygulaması

JFC yani Java Foundation Classes, Java uygulamalarına görsellik katabilmemizi sağlayan grafiksel kullanıcı arayüzleri (Graphical User Interfaces – GUIs) ve zengin grafik fonksiyonaliteler sağlayan özellikler bütünüdür. JFC dendiğinde birden fazla özellikten bahsedebiliriz.

Örneğin ;

  • Swing GUI Bileşenleri : Sayfalarımızda kullandığımız tablolardan düğmelere ya da giriş kutucuklarından menülere kadar tüm bileşenlerdir.
  • Look And Feel Desteği : Java’da yazmış olduğunuz herhangi bir masaüstü uygulamasının görünümünü isterseniz Java isterseniz Windows ya da herhangi başka bir görünüme kavuşturabilirsiniz. Örnek koda Swing’te Pencere Görünümü adlı  makalemden ulaşabilirsiniz.
  • Accessibility API : Bu API ile kullanıcıdan bilgi almak için ekran okuyucuları gibi yardımcı teknolojiler kullanılır.
  • Java 2D API : Yazılımcıların uygulamalarında 2D metinleri, resimleri, grafikleri kullanabilmelerini sağlar.
  • i18n (Internationalization) : Yazılan uygulamaların başka dillere destek vermesi sağlanır.

Yukarıda bahsettiğimiz tüm bu özellikler JFC olarak anılır.

Şimdi Swing kullanarak ilk uygulamamızı geliştirelim. Swing ile kod geliştirmek için en ideal IDE NetBeans olsa da ben Eclipse kullanacağım.

[box type=”info”] NetBeans’te Swing için ekstra plugin indirilmesine gerek yoktur.[/box]

Eclipse’te Swing uygulamaları geliştirmek için tasarlanmış birden fazla plugin var. Ben Google’ın Window Builder eklentisini kullanacağım.

Bu eklentiyi Eclipse’inize eklemek için önce Help menüsünden Install New Software… menüsünü seçiyoruz.

Daha sonra sağ üst kısımdaki Add butonuna tıklayarak Location kısmına http://dl.google.com/eclipse/inst/d2wbpro/latest/3.7 adresini giriyoruz. Bir isim vererek eklentiyi kuruyoruz.

Eklenti kurulduktan sonra IDE’nizi yeniden başlatmalısınız. Zaten Eclipse bunu indirme işlemini bitirdikten sonra size söylüyor.

Yeni bir uygulama yaratıyorum.

Daha sonra src dizininde yeni bir sınıf yaratıyorum. Fakat yaratacağım sınıf JFrame sınıfından türeyecek ve görsel olarak sayfa tasarlayabileceğim. Bunun için New menüsünden yeni bir JFrame yaratıyorum.

Paketin ismine com.javauzmani.view sınıfın ismine ise Merhaba diyorum. Daha sonra da Design kısmına geçiyorum.

Bu aşamadan sonra önce Layout Manager seçiyorum.

[box type=”info”] Layout Manager’larla ilgili yazımı inceleyebilirsiniz.[/box]

Daha sonra da pencereme bir tane düğme yerleştiriyorum.

Butonun üzerine çift tıklayarak ya da sağ klik Add Event Handler ->action -> actionPerformed seçeneklerini takip ederek butona tıklandığında yapılacak iş için yazacağım kod kısmına geçiyorum.

Butona tıkladığımda bir bilgilendirme mesajı verdiren kodu aşağıdaki şekilde yazıyorum.

[codesyntax lang=”java” lines=”no”]

package com.javauzmani.view;

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class Merhaba extends JFrame {

	private static final long serialVersionUID = -4962656916544575558L;
	private JPanel contentPane;

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Merhaba frame = new Merhaba();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	public Merhaba() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		GridBagLayout gbl_contentPane = new GridBagLayout();
		gbl_contentPane.columnWidths = new int[] { 0, 0, 0 };
		gbl_contentPane.rowHeights = new int[] { 0, 0, 0 };
		gbl_contentPane.columnWeights = new double[] { 0.0, 0.0,
				Double.MIN_VALUE };
		gbl_contentPane.rowWeights = new double[] { 0.0, 0.0, Double.MIN_VALUE };
		contentPane.setLayout(gbl_contentPane);

		JButton btnMerhabaDnya = new JButton("Merhaba Du00FCnya");
		btnMerhabaDnya.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				butonaTiklandi();
			}
		});
		GridBagConstraints gbc_btnMerhabaDnya = new GridBagConstraints();
		gbc_btnMerhabaDnya.gridx = 1;
		gbc_btnMerhabaDnya.gridy = 1;
		contentPane.add(btnMerhabaDnya, gbc_btnMerhabaDnya);
	}

	private void butonaTiklandi() {
		JOptionPane.showMessageDialog(this, "Merhaba Dünya", "BİLGİ",
				JOptionPane.INFORMATION_MESSAGE);
	}
}

[/codesyntax]

Uygulamayı çalıştırıp butona tıkladığımda görüntü aşağıdaki gibi oluyor.

SwingX 1.6.3

Java Swing GUI’sine eklentilerle destek veren SwingX’in son sürümü SwingX 1.6.3, 2 Şubat’ta piyasaya çıktı.

Maven’a tam olarak adapte olan kütüphanenin groupId’si org.swinglabs.swingx olarak değişti.

Yeni versiyonda paketler tek bir JAR dosyasında toplanarak güncelleştirildi. Ayrıca  serialization desteği geliştirilerek binlerce bug temizlendi.

 

Swing’te Pencere Görünümü

Masaüstü uygulamaları geliştirirken genellikle IDE’lerin desteklediği eklentiler kullanılır. Bu sayede sürükle bırak mantığı ile hızlı bir şekilde kod geliştirilmiş olur. Java’da basit bir pencere tasarlamak için bile bir sürü kod yazmak gerekir. Bunu hızlandırmak için hali hazırda yazılmış sınıflar vardır. Örneğin bir pencerenin en basit hali ile çalışması için gerekli olan kodlar JFrame adındaki sınıfta zaten yazılmış durumdadır. Biz bu sınıftan kalıtarak ekstra özellikleri kendi sınıfımızda belirtiriz.

Swing GUI Builder bir başka adıyla Matisse Form, Swing’de kullanılan en güzel eklentilerden biridir. MyEclipse ve NetBeans bu eklentiye direk destek veren IDE’lerden bazılarıdır.

Swing teknolojisinde her şey sıfırdan yazılarak çizilir. Swing ile yazılmış bir masaüstü uygulamasının görünümü diğer uygulamalardan biraz farklı görünür. Bunun için UIManager sınıfındaki setLookAndFeel() fonksiyonu kullanılarak klasik bir windows ya da mac görünümü verilebilir.

[codesyntax lang=”java” lines=”no” capitalize=”no”]

private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {

try {

UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");

// pencere açıldıktan sonra değişiklik yapacaksak mutlaka aşağıdaki

// komutların yazılması gerekiyor

SwingUtilities.updateComponentTreeUI(this);

// look and feel ayarının değiştirilmesi için

// o component ve altında çalışan tüm bileşenlerin ayarları değişti

// ama hala eski ayarla açık durumda, ekranın refresh edilmesi gerekiyor

pack(); // ekranın güncellenmesi

} catch (Exception e) {

e.printStackTrace();

}

}

[/codesyntax]

Layout Managers

Layout Manager denilen arayüzler Container içerisindeki bileşenleri görsel olarak yönetebilmemizi sağlayan araçlardır. java.awt paketinde bulunan bu arayüzlerin herbiri bileşenleri yerleştirirken farklı stratejiler kullanır. En çok kullanılanlardan bazılarına birlikte göz atalım.

FlowLayout :

Bileşenleri soldan sağa doğru yerleştirir. Aynı satırda, yer kalmayana kadar ekleme yapılır. İstendiği taktirde bileşenler ortalanabilir ya da sağa dayalı hale getirilebilir.

BorderLayout :

Bileşenleri kuzey, güney, orta, doğu ve batı olmak üzere 5 farklı yerde yönetebilir. (center, north, south ,east ve west) Her bölgeye sadece bir tane bileşen yerleştirilebilir.

BoxLayout :

Bileşenler yatay veya dikey olarak yerleştirilebilir. Axis özelliği X-Axis ya da Y-Axis yapılarak yatay veya dikey olarak kullanılabilir.

GridLayout :

Her bileşen container içerisinde eşit büyüklükteki alanlara yerleştirilir. GridLayout yaratılırken satır ve sütun sayıları belirtilir.

GridBagLayout :

GridLayout’taki gibi satır ve sütunlardan oluşur fakat bileşen için kullanılan alanlar eşit miktarda değildir. Daha kompleks pencereler tasarlamak için kullanılır. En çok kullanılan layout manager’dır.

CardLayout :  Bileşenlerin tamamının tüm pencereyi kaplaması sağlanır. Kurulum sihirbazlarında çok kullanılan bir arayüzdür.

Layout Manager’lar iç içe kullanılabilirler. Bu sayede karmaşık pencerelerin bileşen yönetimi kolaylaşmış olur.