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/DefaultTableModelgibi 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:
JListbir görünümdür; verisi birListModel'dedir (DefaultListModel).JTablebir görünümdür; verisi birTableModel'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,GridBagLayoutbileş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ılabilir1// 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}Ornek2
çalıştırılabilir1// 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}