Java’da swing ile birden fazla pencere kullanan herkesin aklına “bir pencereden diğerini nasıl kontrol edebilirim” sorusu gelmiştir her halde. Bu yazıda bunu örneklemeye çalışacağım. Birbiri ile bağlantılı 3 pencere olacak projemizde. Bunları ana pencere, çocuk pencere ve torun pencere olarak isimlendirelim. Tahmin edebileceğiniz gibi ana pencere’de bir butona basıldığında çocuk pencere, çocuk pencerede bir butona basıldığında torun pencere açılacak.
Bunlara ek olarak çocuk pencereden ana pencere üzerindeki bir yazıyı değiştireceğiz. Ayrıca torun pencere üzerinden hem ana hem de çocuk pencere üzerindeki yazıları değiştireceğiz. Programın ekran görünümü aşağıdaki gibi olacak.
Kavram kargaşasını önlemek için bir pencereyi açan pencereye, o pencerenin atası (parent) diyelim. O halde bu örnekte ana pencere çocuk pencerenin atası, çocuk pencere de torun pencerenin atası olur.
Java’da pencereler arası iletişimi sağlamanın en genel yolu ata pencerenin referansını çocuk pencerenin yapıcı fonksiyonuna parametre olarak vermektir. Aşağıdaki koda bakalım:
ÇocukPencere.java sınıfından bir kod kesimi:
/* Yapıcı fonksiyonu overload ediyoruz. Burada kendisini çağıran (açan) * pencerenin referansını parametre olarak alıyor. */ private AnaPencere ataPencere; public ÇocukPencere(AnaPencere ata){ this.ataPencere = ata; initComponents(); // bu metod pencere üzerindeki buton, etiket, //metin kutusu vb. bileşenleri ilklendirir. }
AnaPencere.java sınıfında çocuk pencerenin açıldığı kod kesimi:
new ÇocukPencere(this).setVisible(true);
Çocuk pencereden ana pencere üzerindeki yazının değiştirildiği kod kesimi:
ataPencere.getAnaYazıLabel().setText(anaTextField.getText());
Daha iyi anlamak için kodların tamamını buradan Netbeans projesi olarak indirip incelemenizi öneririm.
Son olarak şunu hatırlatmakta fayda var. Bir pencererin kapama simgesine tıklanıldığında aşağıdakilerden biri yapılır.
EXIT_ON_CLOSE // tüm programı kapat DISPOSE // Sadece ilgili pencereyi kapat HIDE // pencereyi gizle DO_NOTHING // hiç birşey yapma
Bu projede Ana pencere için bu ayar EXIT_ON_CLOSE şeklinde. Yani ana pencere kapandığında tüm pencereler kapanıyor ve program sonlanıyor. Diğer pencereler için ise DISPOSE olarak ayarlı. Pencereleri Netbeans’te çizerek oluşturuyorsanız bu ayarı properties penceresi üzerinden yapmanız gerekiyor. Eğer doğrudan kodluyorsanız ilgili kod aşağıdaki gibidir.
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
Umarım faydalı olmuştur, herkese iyi çalışmalar.
16 Mart 2012 at 15:13
merhabalar…
birinci pencereye veri tabanında daha önce bulunan şifreyi girdikten ve ok butonuna basıldıktan sonra eğer şifre doğruysa veri tabanından bazı bilgileri çekip bu bilgiler onaylandığındada o anki saati veri tabanına kaydeden projeyi nasıl yaparım yardımcı olurmusunuz.
13 Temmuz 2012 at 01:52
çok teşekkürler. İnternette az bulunur çok faydalı bi yazı olmuş. Projedeki commentler de çok açıklayıcı olmuş. Elinize sağlık.
13 Temmuz 2012 at 03:43
hocam pencereler arası iletişimde sorun yaşıyorum jTableye başka bir pencereden tablo doldur metodunu uygulayamıyorum
13 Temmuz 2012 at 03:54
Eğer JTable Pencere A’da ise ve public değilse, Pencere B’den erişemezsin. YA JTAble’ı public yap ya da JTable’ı güncelleyen public bir metod yaz A Pencersi içinde.
23 Mayıs 2013 at 02:28
Türkçe karakterler kullanmanız kötü olmuş.
25 Mayıs 2013 at 12:18
Evet kodlarda Türkçe karakter kullanmak iyi bir fikir değil. Kesinlikle katılıyorum. Ancak burada çok küçük ve eğitim amaçlı bir örnek söz konusu olduğundan Türkçe karakter kullanmakta bir sakınca görmedim. Bir ara yazıya da böyle bir not düşmeliyim, yeni başlayanlar bunu örnek alıp Türkçe karakter kullanmasınlar 🙂
11 Ağustos 2014 at 16:42
Misal ben projeyi Netbeans ile açıp derlediğimde hata aldım. Baktığımda ‘ç’ harfi, dosya isminde karakter problemi çıkarmış.
Bir sorum olacak. Pencereler arasında iletişim kurarken doğrudan referans göndermenin hem performans olarak üzücü olacağını, hem de programlama tasarımı açısından amatörce olacağını duydum. Pencereler arasında etkileşim kurarken bir pencereye özel Listener yazarak, pencerenin kendisini diğer pencerenin dinleyicisi olarak atama gibi bir yöntem öneriliyor. Tabi bu biraz zahmetli iş… Bu durumdan haberdarsınızdır eminim, katılıyor musunuz bu soruna?
Teşekkürler ders için çok faydalıydı.
12 Ağustos 2014 at 01:02
Proje eğitim amaçlı olduğundan bazı sınıf isimlerinde Türkçe karakter kullanmakta sakınca görmedim. Elbette normalde tavsiye edilmez. Listener kullanmak daha mantıklı bence de. Ama bu derste en basit yöntem anlatıldı. Belki bu dersin 2’sini listener yöntemini anlatmak için hazırlayabilirim. Vakit olursa tabii.
06 Haziran 2014 at 06:54
Çok yararlı bir anlatım olmuş. Başka anlatımlarda bekliyoruz. Elinize sağlık.
11 Haziran 2014 at 22:56
çok işime yaradı teşekkürler ama örnek olarak birinci penceredeki kullanıcı id si ile sorgulama yapıp ikinci pencerede kişi bilgilerini aynı id yi tekrar sorgulatamdan bilgileri güncelleme nasıl yapabilirim banka yönetim sistemleri üzerinde bir projem varda yardımcı olursanız çok sevinirim bu arada sitenizi ço beğendim başarılı ve çok yardımdı dokundu teşekkürler
11 Haziran 2014 at 23:17
Birinci pencereden ikinci pencerenin bir fonksiyonunu id parametresi ile çağırarak olabilir. frame1 içerisinde frame2.FormDoldur(id) gibi bir metot çağrısıyla mesela.
29 Nisan 2016 at 15:39
Çok teşekkür ederim. Diğer sayfaya geçmeyi anlatıyorlar ama bir pencere kapanırken programın kapanmamasını anlatmıyorlar sonunda yapabildim sayenizde 🙂