Java for Kids – 11   July 9th, 2011

Selam sevgili 3-5 takipcim, sizi uzun süredir ihmal ettim, özellikle de Java for Kids konusunda. Bir süredir uzuuun bir dönem hiç ilgilenmek istemedim blogla. Özür dileyerek kaldığım yerden devam ediyorum. Herkese iyi çalışmalar.

Box Layout

java.swing.BoxLayout sınıfı, çoklu pencere bileşenlerini, yatay(x-eskeni) ve dikey(y-ekseni) olarak yerleştirmeye yarar. FlowLayout gibi değildir, pencerenin boyutları değiştiğinde, pencere kontrolleri bozulmaz. BoxLayout ile pencere kontrolleri değişik boyutlar alabilirler, bu GridLayout ta mümkün değildir.
Sıradaki iki satırlık kod, JPanel’de, box layout kullanarak dikey hizalama yapmaktadır.

Jpanel p1 = new JPanel();
setLayout(new BoxLayout(p1, BoxLayout.Y.AXIS));

Bu kodu kısaltmak için, BoxLayout referans nesnesi tanımlamadım, bu örneği oluşturmaktansa, setLayout() metoduna argüman olarak aktardım.

Grid Bag Layout

Bu kısımda java.awt.GridBagLayout manager kullanarak ve panelleri birleştirerek hesap makinesi penceresi oluşturmayı göstereceğim.
Hesap makinemiz, satırlar ve sütunlardan oluşmaktadır, fakat grid layout’ta tüm bileşenlerimiz aynı boyutta olmak zorunda. Bu bizim hesap makinemize uygun değil, çünkü makinemizde, üstte büyük bir yazı alanı var ve bu alan neredeyse 3 buton genişliğinde.
GridBagLayout, Grid sınıfının gelişmiş halidir, grid’de tüm hücreler aynı boyutta olmak zorundayken, girdbag’de farklı boyutlarda hücreler oluşturabiliriz. GridBagLayout sınıfı, GridBagConstraints isimli başka bir sınıfla beraber çalışmaktadır. Constrain(zorlamak), hücre özelliklerini (boyutlarını) belirlemek içindir ve GridBag kullandığımızda her hücre için bu özellikleri ayrı ayrı, ayarlamak zorundayız. Bir hücreye ait sınırlandırma(constraint), bileşen hücreye yerleştirilmeden önce ayarlanmalıdır. Örneğin, zorlamaların(constraint) özelliklerinden birisi izgaraGenisligi(gridwidth) olsun, aynı genişlikte başka hücreler oluşturmamıza izin verecektir.
GridLayout ile çalışırken, ilk önce, sınırlandırılan nesnenin bir örneğini oluşturmalı, sonra bunu özelliklerinin değerlerini belirlemeliyiz(bir kutu oluşturduğumuzu düşünün). Bunları yaptıktan sonra, bileşenimizi, oluşturduğumuz kutunun içindeki hücreye yerleştirebiliriz.

Üstteki resimde gridwidth ızgara genişliği, grid cell (0,0) ve (0,1) koordinatlar ızgara hücreleri, gridheight ızgara yüksekliğidir.

Aşağıdaki kodda, anlaşılması için birçok yorum satırı açıklaması bulunmaktadır.

// pencerenni bileşeni için GridBagLayout seçimi/ayarı yapılır

GridBagLayout gb = new GridBagLayout();
this.setLayout(gb);

// GridBagConstraints sınıfının bir örneği oluşturulur
// bu satırları grid hücresine eklemek istediğiniz
// her bileşen için tekrar yazmak gerekmektedir

GridBagConstraints sinir = new GridBagConstraints();

// hesap makinesinin yazı alanı için sınırların ayarlanması

// grid in x koordinatları

sinir.x = 0;

// grid in y koordinatları

sinir.y = 0;

// bu hücre de diğer hücreler gibi aynı yükseklikte olacak
// onun için bunu birkez tanımlıyoruz

sinir.gridheight = 1; (sinir.gridyukseklik.=1;)

// bu hücre diğer hücrelerden 6 kat daha geniştir

sinir.gridwidth = 6; (sinir.gridgenislik=6;)

// hücredeki tüm boşlukları dolduruyoruz

sinir.fill = sinir.BOTH;

// bu bileşenin yatay boşluklarını orantılıyoruz

sinir.weightx = 1.0;

// bu bileşenin dikey boşluklarını orantılıyoruz

sinir.weighty = 1.0;

// bileşenin içerideki yeri

sinir.anchor = sinir.CENTER;

goruntuAlani = new JTextField();

// bu alan için sınırların ayarlanması

gb.setConstraints(goruntuAlani,sinir);

// pencereye yazı alanı ekliyoruz

pencereicerigi.add(displayField);

Card Layout

Bir deste kâğıt düşünün, sırayla masa üstüne açılmış ve yalnızca en üstteki kartı görebiliyorsunuz. Ya da bir programda bulunan sekmeleri düşünün, bunu yapmak için java.awt.CardLayout manager yardımcı olacaktır.

Bir sekmeyi tıkladığımızda, ekranın içeriği değişecektir. Aslında, panellerin her biri için önceden yüklenmiş ve yerleştirilmiş bir ekran(görüntü) olmalıdır. Kullanıcı hangi kartı(sekme) tıklarsa, program o kartı görünür ve diğerlerini görünmez yapacak ve sadece o kartı getirmiş olacak.

Büyük ihtimalle bu layout’u kullanmayacaksınız, çünkü Swing kütüphanesinde bu işi yapacak daha iyi bir bileşen bulunmaktadır (JTabbedPane).

Layout Kullanmadan, Pencere Oluşturabilir Miyiz?

Tabi ki, oluşturacağınız pencerede, ekleyeceğiniz her bileşen için, bileşeni eklerken ekran koordinatlarını belirlemeniz gerekir. Bu durumda, sınıfınız açık bir şekilde layout kullanmayacağı durumunu bildirmelidir. Java da özel bir kelime/komut bulunmaktadır ve bu komut, “değeri yok” anlamına gelen “null” komutu/kelimesidir. Bu komutu, ileride pek çok defa kullanacağız, aşağıdaki örnek kod, herhangi bir layout kullanılmayacağı anlamına gelmektedir.

Eğer bunu yaparsanız, kodunuz, her pencere bileşeni için ayrı ayrı, sol üst köşenin koordinatları, genişlik, yükseklik değerlerini bildirmelidir. Sıradaki örnek, bir 40 piksel genişliği, 20 piksel yüksekliği olan ve 100 piksel sağda, 200 piksel aşağıda bir buton oluşturacaktır.

Pencere Bileşenleri

Bu kitapta, tüm Swing bileşenleri anlatmayacağım fakat bu bileşenlerle ilgili ayrıntılı bilgiyi ek okuma kısmında bulabileceksiniz, Swing Online Tutorial kısmında bulabilirsiniz ( fakat İngilizce). Bu ekte tüm Swing bileşenlerinin detaylı açıklamaları bulunmaktadır. Bizim hesap makinemiz sadece JButton, JLabel , JTextField kullanmakta, ve diğer kullanılabilecek olan bileşenlerin listesi:

Tabiki menüler(JMenu, JPopupMenu), popup pencereler, çerçeve içinde çerçeveler(JInternalFrame), standart pencereler(JFileChooser, JColorChooser, JOptionPane) oluşturabilirsiniz. Java, kullanılması mümkün olan tüm Swing bileşenlerini barındıran, üstün bir demo uygulama ile gelmektedir. Bu demo, Program Files\Java\jdk1.6.0_16\demo\jfc\SwingSet2 adresindedir. SwingSet2.html dosyasını açın ve inceleyin. Sıradaki resime benzer bir ortam ile karşılaşacaksınız:

Herhangi bir penceredeki araç kutusuna tıklayın ve bu Swing parçasının nasıl çalıştığını görün. Source Code sekmesinde, seçtiğiniz kısmın Java koduna erişebilirsiniz. Örneğin, soldan 4. Sekmeyi seçtiğinizde (JComboBox) aşağıdaki resme benzer bir pencereye erişeceksiniz.

Swing’de, pencerelerinizi güzelleştirmek için birçok farklı bileşen bulunmaktadır. (çn: ben baktım harbiden de süper şeyler var :) )

Bu bölümde, biz Swing bileşenlerini basitçe kodlayarak ve herhangi bir özel araç kullanmadan yazdık. Fakat, sürükle-bırak şeklinde bileşen ekleyebileceğimiz, özel araçlar bulunmaktadır. Bu araçlar, biz sürükle-bırak yaptıktan sonra eklemek istediğimiz Swing bileşeninin kodunu otomatik olarak ekleyecektir. Kolayca Swing ve SWT bileşenleri oluşturabileceğimiz, özel ve ücretsiz GUI (Graphic User Interface-grafiksel kullanıcı arayüzü-) araçlarından birisi, “jigloo “(bu ismi çok mu aramışlar nedir :) )’yu CloudGarden den bulabilirsiniz, bununla ilgili açıklama ek okuma bölümünde verilecektir, ki google den rahatça erişebilirsiniz.

Sonraki bölümde, bir pencerede gerçekleşen kullanıcı hareketlerine nasıl tepki-cevap verileceğini öğreneceksiniz.

Ek Okuma

Swing İçin Detaylı Kaynak:

java.sun/docs/boks/tutorial/uiswing/

Jigloo GUI Builder

cloudgarden.com/jigloo/index.html

JFormattedTextField Sınıfı Hakkında Detaylı Bilgi

java.sun da arama yapıp bulabilirsiniz.

Ödev-Pratik

  1. HesapMakinesi sınıfımızı biraz geliştirerek, +,-,*,/ butonlarını, p2 adında bir panele yerleştirin ve bu paneli içerik kısmının sağ kısmına ekleyin.
  2. JFormattedTextField sınıfı hakkında bilgi edindikten sonra, Hesap Makinemizde bu sınıfı kullanın.

İleri Seviye Ödev-Pratik

Oluşturduğumuz Hesap Makinesi ‘ni geliştirerek, nümerik butonları bir diziye aktarın.

Buttons[] SayiButonlari = new Buttons[9];

İpucu: bir döngü bu işlemi daha kolay şekilde yapmanıza yardımcı olacaktır. Ve 7. Bölümdeki Tic-Tac-Toe oyunumuzdaki koda bakabilirsiniz.
//iyi de ben daha 7. bölümü çevirmedim! Gördünüz mü dil bilmemek ne zor bir durum :)