O kadar java gördük belki birilerine bi faydamız dokunur. Haydi java'da swing kütüphanesinin ögelerini kullanarak basit bi pencere yapalım.

Bu yazıda, JFrame objesininden birkaç method kullanmayı, JFrame ile oluşturulan pencereye JLabel ve JButton eklemeyi, JLabel ögesinin font özelliklerini ayarlamayı ve JButton ögesine ActionListener objesini eklemeyi göreceğiz. Layout olarak da BorderLayout objesinden biraz bahsedeceğim.

Çoğu swing objesini java apisinden öğrenmiş birisi olarak ilk tavsiyem yukarda verdiğim linklere de tıklayıp bi ne var ne yok bakmanız.

Önce kodlarımızı yazalım. Sonra konuşuruz üstünde.

package com.asosyalbebe.swing;

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Pencere {
    public static void main(String[] args) {
        Pencere pencere = new Pencere();
    }

    public Pencere() {
        JFrame pencere = new JFrame("Basit Bir Pencere Yapıyoruz");
        pencere.setSize(300, 100);
        pencere.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pencere.getContentPane().setLayout(new BorderLayout());

        JLabel metin = new JLabel("İlk penceremizi yaptık.");
        metin.setFont(new Font("Serif", Font.BOLD, 25));
        pencere.add("North", metin);

        JButton buton = new JButton("Çıkış");
        buton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.exit(1);
            }
        });
        pencere.add("South", buton);

        pencere.setVisible(true);
    }
}

İlk olarak import kısmından bahsedeyim. Bu kısımda sadece şu üç satırı yazarak da kurtulabilirdiniz:

import java.awt.*;
import java.awt.event.*;
import.javax.swing.*;

Fakat hem neyin hangi paketin içinde olduğunu görmek açısından, hem de programın gereksiz import yapıp yavaşlamaması açısından bu şekilde daha faydalıymış, burada böyle yaptım. Yoksa ben de yıldızlı yöntemi kullanıyorum :)

Ana methoda(public static void main) bakacak olursak, içerisinde Pencere objesini çağırdığımızı görüyoruz. Diğer elemanları neden main'in içinde değil de constructor'un içinde yarattığımın şu anda pek bir önemi yok, fakat ileri düzeyde programlar yazmaya çalışırken böyle olması daha müsait oluyor diyelim, main methodun static olması nedeniyle çeşitli yerlerde istenmedik problemler çıkıyor :)

Gelelim Pencere isimli sınıfımızın constructor'ına. Burada ilk olarak bir pencere yaratmamız gerekiyor. Bunu JFrame nesnesi ile sağlıyoruz. JFrame nesnesini tanımlarken ona penceremizin başlık çubuğunda görüntülenecek olan String'i parametre olarak gönderiyoruz. Bu uygulamada başlık çubuğumuzda "Basit Bir Pencere Yapıyoruz" metni görünecek.

Daha sonra JFrame nesnemize verdiğimiz ismi kullanarak onun özelliklerini tanımlıyoruz. Ben pencere ismini vermiştim. Öyle devam edelim.

Penceremizin boyutunu ayarlamak için JFrame'in bize sunduğu setSize methodunu kullanıyoruz. Parametre olarak iki tane tamsayıyı sırasıyla genişlik ve yükseklik olarak giriyoruz.
pencere.setSize(int width, int height); 

Penceremizin sağ üst köşesindeki çarpı tuşuna tıklandığında gerçekleşecek olan eylemi ayarlamak için JFrame'in setDefaultCloseOperation methodunu kullanıyoruz. Bu methoda parametre olarak JFrame.EXIT_ON_CLOSE sabit değerini atadık. Bu sayede çarpı butonuna tıklandığında program kapatılacak. Bunu ayarlamayı unutursanız eğer, pencereniz kapatmaya çalıştığınızda kapanmak yerine gizlenir, arkaplanda çalışmaya devam eder.
pencere.setSize(JFrame.EXIT_ON_CLOSE);

Şimdi geldik penceremize layout ayarlamaya. Bunun için JFrame'in getContentPane() methodunu kullanarak bize bir Container nesnesi return etmesini sağlayacak, daha sonra da o Container nesnesinin setLayout methodunu kullanıp ona bir layout atayacağız. Ben burada BorderLayout kullandım. BorderLayout nedir diye merak edenler şuradan detaylı anlatımına bakabilir. Ben kısaca bahsedecek olursam, efenim şimdi, BorderLayout ekranı 5 parçaya böler. Bu parçalara "North", "South", "Center", "East", ve "West" isimlerini verir. BorderLayout ile şekillendirilmiş bir alana bir element ekleyeceğimiz zaman hangi alanına ekleyeceğimizi parametre olarak belirtmemiz gerekir. Şimdi penceremizi BorderLayout ile şekillendirelim bakalım.
pencere.getContentPane().setLayout(new BorderLayout());

Şimdi oluşturduğumuz penceremize bir yazı yazalım. Bunun için bir JLabel nesnesi yaratacağız ve yaratırken kullandığımız parametre onun içeriğindeki metin olacak.
JLabel metin = new JLabel("İlk penceremizi yaptık.");

Yarattığımız JLabel nesnesini metin isimli değişkene verdiğimize göre, şimdi onun üzerinde bir iki oynama yapabiliriz. Şimdi yazı tipiyle biraz oynamak istiyorum ben. Bunun için Font nesnesini ve JLabel nesnesinin setFont methodunu kullanacağız.
metin.setFont(new Font("Serif", Font.BOLD, 25));

JLabel nesnemiz üzerindeki düzenlemelerimiz bittiğine göre, şimdi onu penceremize ekleyebiliriz. Bunun için JFrame içindeki add methodunu kullanacağız. Ben bu JLabel ögesini pencerenin üst kısmına eklemeyi uygun gördüm, siz değiştirebilirsiniz tabi ki :)
pencere.add("North", metin);

Şimdi bir buton oluşturalım ve üzerinde çıkış yazsın. Tıklanıldığı zaman da program kapansın. Gelişmiş butonlar oluşturabilmemiz için swing kütüphanemiz bize JButton nesnesini sunar. Bir JButton nesnesi yaratırken kullandığımız parametre onun üzerindeki metni belirler. Şimdi üzerinde çıkış yazan bir JButton nesnesi yaratıp onu buton isimli değişkenimize verelim.
JButton buton = new JButton("Çıkış");

Şimdi bu butonumuza addActionListener methodunu ve ActionListener sınıfını kullanarak bir dinleyici ekleyelim. ActionListener methodundaki actionPerformed methodu, bir action gerçekleştiği zaman bir ActionEvent parametresi ile çağırılır. Biz de actionPerformed methodunun içerisine butona tıklandığında gerçekleşecek olan eylemleri kodlayacağız. Ben burada System.exit(1); komutu ile programı kapatmayı tercih ettim, basit bişey olsun diye.
buton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
                  System.exit(1);
        }
});

Butonumuzu da ayarladığımıza göre, onu da penceremize ekleyebiliriz. Yine aynı işlem, fakat bunu pencerenin aşağı kısmına ekliyoruz.
pencere.add("South", buton);

Ve en son olarak da penceremizin görünür olması için JFrame nesnesinin setVisible methodunu kullanacağız. Bunu penceremize bütün eklemeleri yaptıktan sonra çalıştırmamızda fayda varmış. Hiç çalıştırmazsak da penceremiz görünmüyor.
pencere.setVisible(true);

Penceremizin son halini de koyalım buraya tam olsun:

Bu yazının sonuna geldik. Umarım faydalı bir iş çıkarmışımdır swing'e yeni başlayanlar için. Başka bir yazıda görüşmek üzere, yorumlarınızı beklerim :)

13 yorum

  1. Teşekkürler bu güzel yazı için

    YanıtlaSil
  2. pencere.setVisible(true) satırının sonunda ; olması gerekiyor, gözünüzden kaçmış galiba.

    YanıtlaSil
    Yanıtlar
    1. Teşekkür ederim gözümden kaçmış, düzelttim :)

      Sil
  3. Merhabalar
    label e sadece text mi yazdırılabilir acaba? bir işlem sonucunu(10 satırlık) pencere ile nasıl yazdırabilirim? Lütfen yardım...

    YanıtlaSil
    Yanıtlar
    1. Merhaba Rabia,

      İstediğiniz şey sanırım birden çok satırı tek JLabel içerisine yazmak. Şu linkte basit bir çözümü var:
      http://stackoverflow.com/questions/2152742/java-swing-multiline-labels

      Onun haricinde, JLabel kullanmak yerine aşağıdaki gibi farklı çözümler de üretebiliriz:
      http://stackoverflow.com/a/5816711/618279

      Sil
    2. işlem sonucunu verecek bir DEĞİŞKENİ yazdırmak istiyorum. Bunlar yanılmıyorsam text yazdırmak için yalnızca. Bu arada hızlı cvp için çok teşekkürler :)

      Sil
    3. Değişkenin türü nedir? String ise jLabel.setText(degisken) şeklinde yazdırabilirsiniz. Değişkenin türünü belirtirseniz daha kolay yardımcı olabilirim :)

      Sil
    4. 1 den 10 a kadar sayıların faktoriyellerini yazdırmak istiyorum. Çok amatorce oldu, Java da yeniyim de :)

      Sil
    5. ama consol a yazdırmak istemiyorum

      Sil
    6. Aşağıdaki gibi bir kodla soruna çözüm üretebiliriz:

      http://pastebin.com/9tDqBgFP

      Sil
    7. iletişim bakanlığı tarafından engellenmiş bir site. bilgiye ulaşamıyorum

      Sil
    8. O zaman şu iki linkten birisini deneyin. Yüce devletimiz bu siteleri de engellemediyse bir sıkıntı çıkmayacaktır:

      http://chopapp.com/#4egvklj0
      http://dpaste.com/3P06WJQ

      Sil