Herkese merhaba.

Bu ay, Java'da Swing kullanarak grafik arayüzü oluşturmayı öğreneceğiz. Kısaca özetlemek gerekirse; günümüz bilgisayar programlarını iki kısımda incelemek mümkündür. Birincisi, bir hesaplama yapmak, veritabanı sorgulamak, dosya gönderip almak gibi işlemlerin yapıldığı koddur. İkincisi ise, kullanıcı ile program arasında köprü görevi yapan, kullanıcının programa veri girmesini ve programın ürettiği verileri kullanıcıya iletmesini sağlayan, yani programla kullanıcı arasında iletişimi sağlayan arayüz kısmıdır. Swing, günümüz uygulamalarınca kullanılan kullanıcı arabirimini (GUI – Graphical User Interface) tanımlayan sınıflar ve arabirimler koleksiyonudur. Aynı amaçla kullanılan Abstract Window Toolkit (AWT)'nin yetersizliklerini gidermek için 1997 yılında kullanılmaya başlanmıştır. Swing ilk defa Java 1.1 için ayrı bir kütüphane halinde sunulmuştur, daha sonra Java 1.2 ile birlikte Java'nın bir parçası haline gelmiştir.

İlk Swing Uygulamamız

Bu kısa bilgiden sonra ilk Swing uygulamamızı yazmaya başlayabiliriz. İlk Swing programımızdaki amaç, ekranda içi boş bir pencere oluşturmak. Aşağıdaki kodu inceleyelim.

import javax.swing.*;
public class HelloWorld {
        public HelloWorld(){
            JFrame jfr = new JFrame("Merhaba, Dunya!");
            jfr.setSize(300,150);
            jfr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jfr.setVisible(true);
        }
        public static void main(String[] args){
            HelloWorld hw = new HelloWorld();
        }
}

Bu kodu HelloWorld.java adlı bir dosyaya kaydedelim. "javac HelloWorld.java" komutuyla derledikten sonra, "java HelloWorld" komutuyla programı çalıştıralım. Programın çıktısı şekildeki gibidir.

Bu noktada ufak bir hatırlatma yapmakta fayda var. Java'da dosya ismi ile dosyada tanımlanan sınıf ismi aynı olmalıdır. Sınıfımızın ismini HelloWorld olarak seçtiğimiz için dosyamızın ismi HelloWorld.java olarak belirliyoruz.

Şimdi, kodumuzu yakından inceleyelim.

import javax.swing.*;

Bu satırla, programımıza, JFrame'in tanımlı olduğu kütüphaneyi eklemiş oluyoruz. JFrame, ekranda görünen pencereyi temsil eden bir sınıftır. JFrame nesnesi üzerinde yapacağınız değişiklikler, doğrudan pencereye yansır.

JFrame jfr = new JFrame("Merhaba, Dunya!");

Bu satırla JFrame nesnemizi, yani penceremizi oluşturuyoruz ve başlığını "Merhaba Dunya!" olacak şekilde ayarlıyoruz. Bunu yapmanın bir diğer yolu JFrame'in setTitle metodunu kullanmaktır. Fakat kullandığımız yapıcı fonksiyon (constructor) bu işi bizim yerimize yapıyor.

jfr.setSize(300,150);

Penceremizin boyutlarını, genişliği 300, yüksekliği 150 piksel olacak şekilde ayarlıyoruz.

jfr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Pencerenin köşesindeki kapatma tuşuna tıkladığımızda programımızın sonlanması için JFrame'in setDefaultCloseOperation metodunu, yine JFrame'de tanımlı EXIT_ON_CLOSE sabitiyle çağırıyoruz.

jfr.setVisible(true);

Son olarak, penceremizin ekranda görünmesi için, JFrame'imizin setVisible metodunu kullanıyoruz.

İşte ilk Swing programımızı yazdık bile! Pek kapsamlı bir program olmasa ve göze pek hitap etmese de, bu henüz başlangıç. Daha zengin Swing uygulamaları hazırlamamız için, Swing kütüphanesinde tanımlı çok sayıda bileşen (component) vardır. JLabel, JButton, JTextField, JTextArea, JRadioButton, JCheckBox, JSlider bunlardan sadece birkaçıdır. İkinci örneğimizde JLabel, JButton ve JTextField bileşenlerini inceleyeceğiz.

Bir JLabel nesnesi; ekranda yazı, resim veya hem yazı hem resim görüntülemek için kullanılır. JButton, Swing uygulamalarında sıkça kullanılan bir bileşendir. Üzerine tıklanabilecek bir düğme yaratmak için kullanılır. JTextField ise, kullanıcının tek satırlık bilgi girmesini sağlayan ya da tek satırlık bir bilgiyi ekranda görüntülemek için kullanılan bir bileşendir. İkinci programımız, kullanıcıdan, ismini girmesini isteyecek. Kullanıcı, ismini ayrılan alana girip "Tamam" düğmesine tıkladığında, ekranda onu karşılayan bir mesaj belirecek. Merhaba.java dosyamızın kaynak kodunu verelim.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Merhaba {
    JTextField text;
    JButton button;
    JLabel label;   
    public Merhaba(){
        JFrame jfr = new JFrame("Merhaba");
        jfr.getContentPane().setLayout(new FlowLayout());
        jfr.setSize(400,150);
        jfr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        text = new JTextField(10);
        jfr.getContentPane().add(text);
        button = new JButton("Tamam");
        jfr.getContentPane().add(button);
        label = new JLabel("Lutfen isminizi girin.");
        jfr.getContentPane().add(label);
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e){
                label.setText("Merhaba " + text.getText());
            }
        });     
        jfr.setVisible(true);
    }
    public static void main(String[] args){
        Merhaba m = new Merhaba();
    }
}

Programın çıktısı ve kullanıcı ismini girip Tamam butonuna tıkladıktan sonraki hali şekildeki gibidir.

İlk olarak, ContentPane ve Layout kavramlarını açıklayalım. Swing uygulamalarında JLabel, JButton, JTextField gibi bileşenler (component), bir taşıyıcı veya kap (container) üzerine yerleştirilirler. Taşıyıcılar, çok sayıda bileşeni ve başka taşıyıcıları üzerinde barındıran nesnelerdir. Yani bir JButton ya da diğer bir bileşen JFrame'e değil, bir taşıyıcı nesnesine eklenir. Her JFrame için önceden tanımlı bir taşıyıcı vardır. Bu taşıyıcıyı elde etmek için JFrame'deki getContentPane() metodunu kullanırız. Bu metod, bileşenlerin üzerine eklenebileceği, JFrame'e ait taşıyıcıya (ContentPane) bir referans döndürür. Yerleşimler (Layout) ise, taşıyıcıya eklenen bileşenlerin ekranda nasıl yerleştirileceğini belirler. Bu yazımızda Layout'ların ayrıntısına girmeyeceğiz. FlowLayout, en çok kullanılan yerleşimlerden biridir. Taşıyıcıya eklenen bileşenlerin, eklendiği sırada, soldan sağa, satır sonuna gelindiğinde ise yukarıdan aşağı doğru görüntülenmesini sağlar. GridBagLayout, GridLayout, BorderLayout sıkça kullanılan diğer yerleşimlerdir. Şimdi kodumuzu yakından inceleyelim.

jfr.getContentPane().setLayout(new FlowLayout());

Bu satırda penceremizin (JFrame) ContentPane'inin yerleşimini FlowLayout olacak şekilde seçiyoruz. Bundan sonra ContentPane'e eklenecek bileşenler, ekranda FlowLayout yerleşiminin gerektirdiği şekilde görünecektir.

text = new JTextField(10);
jfr.getContentPane().add(text);

Bu iki satırda, kullanıcının ismini girmesine imkan tanıyan, 10 sütun genişliğinde bir JTextField bileşeni tanımlıyoruz ve penceremizin ContentPane'ine ekliyoruz.

button = new JButton("Tamam");

Düğmemizi, üzerinde "Tamam" yazısı görünecek şekilde oluşturuyoruz. JButton'lar üzerinde yalnızca yazı kullanmak zorunda değiliz. Onun yerine bir resim, hatta hem yazı hem resim de kullanabiliriz.

label = new JLabel("Lutfen isminizi girin.");
jfr.getContentPane().add(label);

Bu satırlarda, başlangıçta "Lutfen isminizi girin." yazısını gösteren bir JLabel oluşturuyoruz ve pencerenin ContentPane'ine ekliyoruz.

button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e){
        label.setText("Merhaba " + text.getText());
    }
    });

Programımızın en can alıcı ve anlaması diğerlerine göre biraz daha zor olabilecek satırları bunlar. Bu satırlarda, ekranda görünen düğmeye (JButton) tıkladığımız zaman ne olması gerektiğini yazıyoruz. JButton'ın addActionListener metodunu, bir ActionListener ile çağırıyoruz. ActionListener, içinde actionPerformed metodunu barındıran bir arabirim (interface)dir. ActionPerformed metodu yukarıdaki gibi tanımlanmış bir ActionListener nesnesini JButton'a göndererek, düğmenin tıklanması durumunda yapılacak şeyi belirlemiş oluyoruz. JLabel'ın setText metodu, JLabel'da görünen yazıyı değiştirmeye yararken, getText metodu bu yazıyı String olarak döndürür.

Sonuç

Bu ay, Java'daki Swing kütüphanesini kullanarak göze hitap eden grafik kullanıcı arayüzlerini nasıl yapabileceğimizi öğrendik. Swing kütüphanesi, elbette ki bu gördüklerimizden ibaret değildir, içinde çok farklı amaçlara hizmet eden ve hayatımızı kolaylaştıran sayısız eleman barındırır. Önümüzdeki ay, Swing'in diğer özelliklerini tanıyıp, daha güzel ve daha işlevsel uygulamalar geliştirmeyi öğreneceğiz. Önümüzdeki ay görüşmek üzere. Hoşçakalın :)