Harun Reşit Zafer

bâki kalan bu kubbede bir hoş sadâ imiş

Java Swing Pencerler Arası İletişim


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.

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInPrint this pageEmail this to someone

12 Yorum

  1. 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.

  2. çok teşekkürler. İnternette az bulunur çok faydalı bi yazı olmuş. Projedeki commentler de çok açıklayıcı olmuş. Elinize sağlık.

  3. hocam pencereler arası iletişimde sorun yaşıyorum jTableye başka bir pencereden tablo doldur metodunu uygulayamıyorum

    • admin

      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.

  4. Türkçe karakterler kullanmanız kötü olmuş.

    • admin

      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 :)

      • 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ı.

      • 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.

  5. Çok yararlı bir anlatım olmuş. Başka anlatımlarda bekliyoruz. Elinize sağlık.

  6. ç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

    • admin

      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.

  7. Ç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 :)

Bir Cevap Yazın

E-posta adresiniz yayınlanmayacak

*

© 2016 Harun Reşit Zafer

Temayı tasarlayanAnders NorenYukarı ↑