Aklımda Kalası Kelimeler

* давайте работать вместе
* Zarf ve Mazruf, Zerafet(xHoyratlık) ile aynı kökten(za-ra-fe) gelir
* Bedesten
* Suç subuta ermiştir - Suç sabit olmuştur
Swing etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Swing etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

9 Aralık 2009 Çarşamba

Swing ile programlama 3 - ActionListener

GUI de öncelikle bir pencere(window) ye ihtiyacımız vardı. Ki bu window diğer bileşenlerimizi içersin. İşte javada barındırıcı penceremiz (container) JFrame den hazırlanmıştı. Şimdi de bu ana penceredeki bileşenlerin üreteceği olayları(event) nasıl yakalarız ve nasıl sonuç üretiriz onu yazalım.

Bunun içinde bir yerlerden ActionListener kullanmamız gerektiğini duymuş olalım.

Önce ActionListener nedir?
  • Sınıf mıdır? Arayüz müdür? Soyut mudur?
  • Ne yapar bizim için?



public interface ActionListener extends EventListener {

/**
* Invoked when an action occurs.
*/
public void actionPerformed(ActionEvent e);

}


Arayüzmüş. Demek ki bundan sınıflar türetebiliriz. Bu güzel. Peki nedir ActionListener?

Swing’de, görsel bileşenlerden (ui components) tetiklenen olaylara (action) dinleyici (listener) eklemek için bu komut kullanılır. Örneğin bir butona eklenen dinleyiciyle, butona tıklama olayından sonra butonun işini yapmasını sağlayabilirsiniz. Ufak bir de not, bir görsel bileşene birden fazla dinleyici eklenebilir, böylece bir olaydan tetiklenen sayısız iş yaptırılabilir. Referans:Kayıp Şehir


Bir bileşen üzerinde gerçekleşen hareket durumunu (action event) almak ve işlemek için oluşturacağımız objenin sınıfı bu arayüzü kullanır. Şimdi bizim bir nesneye ihtiyacımız var. Bu nesneyi frame üzerindeki bileşenin birine kaydedeceğiz. Yani, diyeceğizki nesnemize, bu bileşeni sen marke edeceksin. Nesnemiz, ilgili bileşenin karıştığı bir hareket durumunu (action event) yakalayacak ve ait olduğu sınıftan aldığı metodu tetikleyecektir.


package javaapplication;

import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class Main {

public static void main(String[] args) {
JFrame frame = new JFrame("Başlıkta görünsün");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(250, 450);
frame.setVisible(true);

int iYatayBosluk = 5;
int iDikeyBosluk = 15;
LayoutManager layoutMgr = new FlowLayout(FlowLayout.CENTER, iYatayBosluk, iDikeyBosluk);

// javax.swing paketindeki rootpanecontainer interface'inin bir metodu.
// Kısaca top-level container'ların contentpane'ine erişmek için kullanılır.
Container enUsttekiKap = frame.getContentPane();

enUsttekiKap.setLayout(layoutMgr);

// Frame üzerine koymak istediğimiz JLabel bileşenini oluşturup
JLabel lbl = new JLabel();
// Metnini değiştiriyoruz
lbl.setText("İsim: ");
// JLabel sınıfından oluşturduğumuz lbl nesnesini ekliyoruz.
enUsttekiKap.add(lbl);


// 5 kolonluk bir genişlikte metin kutusu oluştur.
final JTextField txt = new JTextField(5);
enUsttekiKap.add(txt);

txt.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {
txt.setBackground(Color.red);
}
});

// Bir de düğme ekleyelim.
final JButton btn = new JButton("GÖNDER");
enUsttekiKap.add(btn);

ActionListener alBtn = new ActionListener() {

public void actionPerformed(ActionEvent e) {
btn.setText("Düğmeye basıldı");
}
};

btn.addActionListener(alBtn);
}
}




Swing ile programlama 2 - LayoutManager ile frame tasarımı

Birden fazla bileşeni Frame üzerine yerleştirmeye çalıştığımızda bileşenlerin frame üzerinde duruşlarını belirlememiz gerekecektir.

Başlarken bir önceki makalemizde yazdıklarımızın üzerine bir şeyler ilave etmeye çalışalım.

Şimdi bir şekilde öğrendik ki; Java'da Swing bileşenleri ile bir GUI(Graphical User Interface) oluştururken bileşenleri barındıracak nesnenin(container) Layout'unun tanımlanması gerekiyor. Bu set etme işini de aşağıdaki kodla yapabiliriz.
frame.getContentPane().setLayout(........)



Bu da LayoutManager arayüzünün açıklaması:


AWT ve Swing içinde 8 farklı Layout vardır ve hepside LayoutManager arayüzünü uygularlar.



FlowLayout için LayoutManager arayüzünün uyarlanışı:
public class FlowLayout extends Object implements LayoutManager, Serializable

FlowLayout sınıfından bir nesne türetelim ve LayoutManager olarak setLayout metoduna parametre olarak gönderelim. Bunun için FlowLayout sınıfının yapıcı metotlarından 3. sünü kullanalım.




Artık bundan sonrası frame üzerinde bileşenlerin nasıl durduğunu görmek (frame üstüne bileşen eklemenin nasıl olduğunu bundan önceki makalemizde görmüştük). Bu kısım için en güzel kaynak: Sun'ın java bağlantılarıdır.

Frame üzerine birkaç bileşen ekleyelim ve son durumunu görelim.


Ve bu yazdıklarımızın yazı hali:

package javaapplication;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.LayoutManager;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class Main {

public static void main(String[] args) {
JFrame frame = new JFrame("Başlıkta görünsün");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(250, 450);
frame.setVisible(true);

int iYatayBosluk = 5;
int iDikeyBosluk = 15;
LayoutManager layoutMgr = new FlowLayout(FlowLayout.CENTER, iYatayBosluk, iDikeyBosluk);

// javax.swing paketindeki rootpanecontainer interface'inin bir metodu.
// Kısaca top-level container'ların contentpane'ine erişmek için kullanılır.
Container enUsttekiKap = frame.getContentPane();

enUsttekiKap.setLayout(layoutMgr);

// Frame üzerine koymak istediğimiz JLabel bileşenini oluşturup
JLabel lbl = new JLabel();
// Metnini değiştiriyoruz
lbl.setText("İsim: ");
// JLabel sınıfından oluşturduğumuz lbl nesnesini ekliyoruz.
enUsttekiKap.add(lbl);


// 5 kolonluk bir genişlikte metin kutusu oluştur.
JTextField txt = new JTextField(5);
enUsttekiKap.add(txt);

// Bir de düğme ekleyelim.
JButton btn = new JButton("GÖNDER");
enUsttekiKap.add(btn);
}
}


Ve uygulama:

Swing ile programlama 1

Swing ile basit bir form oluşturmak dedik. Aslında bildiğiniz üzere bir java ya da c# uygulaması (sınıfı)
static void Main(String[] args)
imzalı bir metoda sahip olmak zorundadır. Biz bu sınıfımızı çalıştırılabilir olarak derledikten sonra "yüklendiğinde sınıfın ilk okunacak metodu bu olsun" dediğimiz main metoduna
- form/frame oluştur
- çeşitli buton, label, grid v.s. bileşenleri oluştur ve bu form/frame in üzerine ekle diyoruz.

Hadi sırayla görelim ne nasıl oluyor:






Peki bir de label ekleyelim formumuza:




Sonuçta kodumuz budur:

package javaapplication;

import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Main {

public static void main(String[] args) {
JFrame frame = new JFrame("Başlıkta görünsün");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setSize(250, 450);

frame.setVisible(true);

// javax.swing paketindeki rootpanecontainer interface'inin bir metodu.
// Kısaca top-level container'ların contentpane'ine erişmek için kullanılır.
Container enUsttekiKap = frame.getContentPane();

// Frame üzerine koymak istediğimiz JLabel bileşenini oluşturup
JLabel lbl = new JLabel();

// Metnini değiştiriyoruz
lbl.setText("Buda içeriği olsun");

// JLabel sınıfından oluşturduğumuz lbl nesnesini ekliyoruz.
enUsttekiKap.add(lbl);
}
}