Eğitim Portalı/Java/Swing'e Giriş
Java01-java/64-swing-giris

Swing'e Giriş

Swing, Java'nın AWT üzerine kurulu, daha zengin ve platformdan bağımsız masaüstü GUI kütüphanesidir (1998). AWT'nin işletim sistemine bağlı "ağır" bileşenlerinin aksine, Swing bileşenleri Java ile çizilir (lightweight…

Swing'e Giriş

Swing, Java'nın AWT üzerine kurulu, daha zengin ve platformdan bağımsız masaüstü GUI kütüphanesidir (1998). AWT'nin işletim sistemine bağlı "ağır" bileşenlerinin aksine, Swing bileşenleri Java ile çizilir (lightweight); bu yüzden her platformda tutarlı görünür ve görünümü ("look and feel") değiştirilebilir. JFrame, JButton, JTable, JTree, JTabbedPane gibi yüzlerce bileşen sunar.

Not: Portal headless çalıştığı için gerçek pencere açılamaz. Ancak Swing'in en önemli kavramı olan MVC model katmanı ekran gerektirmez — bu örnekler Swing'in DefaultListModel/ DefaultTableModel gibi gerçek model sınıflarını çalıştırır. Tam pencere kodu aşağıdadır.

Swing'in kalbi: MVC ve model-görünüm ayrımı

Swing'in en güçlü tasarım fikri MVC (Model-View-Controller)'dir: veri (model), onu gösteren görünümden (view) ayrıdır. Örneğin:

  • JList bir görünümdür; verisi bir ListModel'dedir (DefaultListModel).
  • JTable bir görünümdür; verisi bir TableModel'dedir (DefaultTableModel).

Bu ayrımın faydası büyük: veri mantığını GUI'den bağımsız tutar ve test edersin (bu örnekler gibi). Örnek 1 (./Ornek1.java) DefaultListModel ve DefaultTableModel ile veriyi (ekleme, silme, güncelleme) doğrudan, görsel olmadan işler.

Model olayları: "veri değişti → görünüm güncellensin"

MVC'nin sihri olay bildirimindedir: model değiştiğinde, kayıtlı dinleyicilere bir olay yayılır. Gerçek uygulamada bu dinleyici görünümün kendisidir (JTable); olayı alınca ilgili hücreleri yeniden çizer:

model.addTableModelListener(e -> { /* görünümü güncelle */ });
model.addRow(...);       // -> INSERT olayı yayılır
model.setValueAt(...);   // -> UPDATE olayı yayılır

Örnek 2 (./Ornek2.java) bir TableModelListener ekleyip ekleme/güncelleme/silme olaylarını gözlemler. Sen sadece modeli güncellersin; senkronizasyonu Swing halleder.

Gerçek Swing penceresi (kendi makinende)

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

public class MerhabaSwing {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {        // GUI işleri EDT'de yapılır
            JFrame f = new JFrame("Swing Penceresi");
            JButton b = new JButton("Tıkla");
            JLabel l = new JLabel("Henüz tıklanmadı");
            b.addActionListener(e -> l.setText("Tıklandı!"));

            JPanel panel = new JPanel(new FlowLayout());
            panel.add(b); panel.add(l);
            f.add(panel);
            f.setSize(300, 150);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setVisible(true);
        });
    }
}

Önemli kurallar:

  • EDT (Event Dispatch Thread): Tüm GUI güncellemeleri tek bir özel thread'de yapılmalıdır (SwingUtilities.invokeLater). Uzun işleri arka planda (SwingWorker) çalıştır, EDT'yi bloklama.
  • Layout yöneticileri: FlowLayout, BorderLayout, GridLayout, GridBagLayout bileşenleri konumlandırır (elle koordinat yerine).

Bugün Swing nerede?

Swing hâlâ masaüstü Java uygulamalarında (IntelliJ IDEA dahil!) yaygındır. Alternatifler: JavaFX (daha modern masaüstü), ve çoğu yeni uygulama için web (Spring Boot + bir frontend — bu portal gibi). Yine de MVC, olay modeli ve model-görünüm ayrımı, öğrendiğinde her UI teknolojisine aktarılan kavramlardır.

Özet

Swing'in AWT üzerine kurulu, zengin ve platformdan bağımsız GUI kütüphanesi olduğunu; en önemli fikri olan MVC model-görünüm ayrımını (DefaultListModel/DefaultTableModel; Örnek 1) ve model olaylarıyla görünümün güncellenmesini (TableModelListener; Örnek 2) öğrendik; gerçek JFrame kodunu, EDT kuralını ve layout yöneticilerini gördük. Sırada, sunucu tarafı Java'nın temeli: Servlet.

Kod Örnekleri(2)

Ornek1

çalıştırılabilir
Ornek1.java
1// Ornek1: Swing veri modelleri — DefaultListModel ve DefaultTableModel (ekran gerekmez).
2// Swing MVC'dir: VERİ (model) görselden (JList/JTable) ayrıdır. Burada MODEL katmanını gösteriyoruz.
3// Çalıştırma: java Ornek1.java
4import javax.swing.DefaultListModel;
5import javax.swing.table.DefaultTableModel;
6
7public class Ornek1 {
8
9    public static void main(String[] args) {
10        // DefaultListModel: bir JList'in arkasındaki veri. (Görsel olmadan da çalışır.)
11        DefaultListModel<String> liste = new DefaultListModel<>();
12        liste.addElement("Ada");
13        liste.addElement("Burak");
14        liste.addElement("Can");
15        liste.add(1, "Derya");        // araya ekle
16        liste.removeElement("Can");
17        System.out.println("ListModel boyut: " + liste.size());
18        for (int i = 0; i < liste.size(); i++) System.out.println("  " + i + ": " + liste.get(i));
19
20        // DefaultTableModel: bir JTable'ın arkasındaki tablo verisi.
21        String[] basliklar = { "Ürün", "Fiyat", "Stok" };
22        DefaultTableModel tablo = new DefaultTableModel(basliklar, 0);
23        tablo.addRow(new Object[]{ "Klavye", 450, 12 });
24        tablo.addRow(new Object[]{ "Mouse", 250, 40 });
25        tablo.addRow(new Object[]{ "Monitör", 3200, 5 });
26
27        System.out.println("\nTablo (" + tablo.getRowCount() + " satır, " + tablo.getColumnCount() + " sütun):");
28        for (int r = 0; r < tablo.getRowCount(); r++) {
29            System.out.printf("  %-8s | %5s TL | stok %s%n",
30                    tablo.getValueAt(r, 0), tablo.getValueAt(r, 1), tablo.getValueAt(r, 2));
31        }
32        // Hücre güncelle (gerçek JTable'da görünüm OTOMATİK yenilenir):
33        tablo.setValueAt(15, 0, 2); // Klavye stok -> 15
34        System.out.println("Klavye yeni stok: " + tablo.getValueAt(0, 2));
35
36        System.out.println("""
37
38                --- Swing veri modelleri (MVC) ---
39                Swing MVC'dir: VERİ (model) ile GÖRÜNÜM (JList/JTable) ayrıdır.
40                DefaultListModel -> JList'in verisi; DefaultTableModel -> JTable'ın verisi.
41                Model değişince görünüm OTOMATİK güncellenir (model olayları üzerinden — sonraki örnek).
42                Bu ayrım sayesinde veri mantığını GUI'den bağımsız test edebilirsin (bu örnek gibi).""");
43    }
44}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.

Ornek2

çalıştırılabilir
Ornek2.java
1// Ornek2: Swing model olayları — TableModelListener (model değişince görünüm nasıl haberdar olur).
2// Çalıştırma: java Ornek2.java
3import javax.swing.event.TableModelEvent;
4import javax.swing.event.TableModelListener;
5import javax.swing.table.DefaultTableModel;
6
7public class Ornek2 {
8
9    public static void main(String[] args) {
10        DefaultTableModel model = new DefaultTableModel(new String[]{ "Görev", "Durum" }, 0);
11
12        // Gerçek JTable, modele bir dinleyici ekler ve değişiklikte kendini çizer.
13        // Burada o dinleyiciyi BİZ ekliyoruz; modelin yaydığı olayları görelim.
14        model.addTableModelListener(new TableModelListener() {
15            @Override public void tableChanged(TableModelEvent e) {
16                String tur = switch (e.getType()) {
17                    case TableModelEvent.INSERT -> "EKLEME";
18                    case TableModelEvent.DELETE -> "SİLME";
19                    case TableModelEvent.UPDATE -> "GÜNCELLEME";
20                    default -> "DİĞER";
21                };
22                System.out.println("  [model olayı] " + tur + " (satır " + e.getFirstRow() + ")");
23            }
24        });
25
26        System.out.println(">> addRow:");
27        model.addRow(new Object[]{ "Tasarım", "Bekliyor" });
28        model.addRow(new Object[]{ "Kodlama", "Bekliyor" });
29        System.out.println(">> setValueAt (güncelle):");
30        model.setValueAt("Tamamlandı", 0, 1);
31        System.out.println(">> removeRow:");
32        model.removeRow(1);
33
34        System.out.println("Son durum: " + model.getValueAt(0, 0) + " -> " + model.getValueAt(0, 1));
35
36        System.out.println("""
37
38                --- Swing model olayları ---
39                Model değiştiğinde (ekleme/silme/güncelleme), kayıtlı dinleyicilere bir TableModelEvent yayılır.
40                Gerçek uygulamada bu dinleyici JTable'ın KENDİSİDİR; olayı alınca ilgili hücreleri yeniden çizer.
41                Bu, MVC'nin "model değişti -> görünüm güncellensin" akışıdır (observer deseni).
42                Sen sadece modeli güncellersin; senkronizasyonu Swing halleder.""");
43    }
44}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.