SWING İle GRAFİKSEL UYGULAMALAR-I Hedefler Bu üniteyi çalıştıktan sonra; AWT ve SWING kavramlarını öğreneceksiniz, SWING bileşenlerini tanıyacaksınız, Java GUI yapısını oluşturan bileşenleri öğreneceksiniz, Konteyner (container) kavramını öğreneceksiniz, Yerleşim planı düzenleyicilerini (Layoutları) öğreneceksiniz, Öğr.Gör. Bülent ÇOBANOĞLU Yrd. Doç.Dr. Ahmet ZENGİN SWING Uygulamaları-I İçindekiler SWING ile GRAFİKSEL KULLANICI ARAYÜZÜ (GUI) PROGRAMLAMA Giriş Temel GUI Bileşenleri SWING ile uygulamalar geliştireceksiniz, Yerleşim planı düzenleyicileri ( Layout yöntemleri) Konunun Özeti Değerlendirme Soruları Öğr.Gör. Bülent ÇOBANOĞLU Yrd. Doç.Dr. Ahmet ZENGİN Sayfa 2 2 SWING Uygulamaları-I SWING ile GRAFİKSEL KULLANICI ARAYÜZÜ (GUI) PROGRAMLAMA Giriş Java dili, programcılara grafik uygulamalar için geniş imkânlar sunar, bu özelliği ile hareket bağımlı (Eventdriven ) bir dilin tüm özelliklerine sahiptir. Buton, pencere, metin ve resim kutusu, menüler vb. kontrol nesneleri yardımıyla kullanıcı ile etkileşimli grafiksel kullanıcı ara yüzü (Graphical User Interface-GUI) oluşturabilirsiniz. GUI ile programlarımıza görsellik kazandırmış oluruz. AWT (Soyut Pencereler Araç Kiti-Abstract Window Toolkit), Java ile birlikte geliştirilen ilk temel grafiksel kullanıcı ara yüzü oluşturma kütüphanesine verilen isimdir. AWT, pencere tabanlı- grafiksel ara yüz desteği sağlar. Ancak Java 2 platformu ile birlikte AWT yetersiz görülmüş ve çok daha geniş ve gelişmiş özelliklere sahip SWING Kütüphanesi ( AWT ye göre yüzlerce yeni sınıfın eklendiği ) sisteme eklenmiştir. Swing bileşenleri, AWT bileşenleri ile aynı ismi taşırlar, tek fark J harfi ile başlamalarıdır (Button JButton, Label JLabel, CheckBox JCheckBox gibi ) diyebiliriz. SWING, Java Koleksiyon Yapısı (JFC- Java Collections Framework) nın bir üyesidir ve tamamen Java dili ile yazılmıştır. Swing, bütün platformlarda aynı şekilde davranabilen ve görünümü değişmeyen (AWT bileşenleri, Windows’ta farklı, MacOS’da farklı görülebiliyordu) arayüzler sunar ve platform bağımsızdır. Grafiksel kullanıcı ara yüzü oluşturmak ve uygulama geliştirmek için java.awt ve javax.swing olmak üzere iki temel bileşen kümesindeki paketler kullanılır. Kontrol nesnelerini kullanabilmek için bu iki bileşen ve ilgili alt sınıflarını program başlangıcında çağırmak gerekir. Şekil 2’de verilen SWING bileşenlerinin hiyerarşik yapısındaki sınıfları açıklayacak olursak, en üst (top level) seviyede barındırıcı (container-konteyner) sınıflar bulunur. Konteynerler diğer bileşenleri içinde barındırabilen özel bileşenlerdir. Bu tür konteynerler içerisinde başka üst düzey konteyner tanımlanamaz. Bunlar; JApplet: SWING tabanlı applet yazımında kullanılır. JApplet sınıfı ‘jawax.swing.JApplet’ paketi ile çağrılır / import edilir. JDialog: Kullanıcı ile iletişim kurmada JOPtionePane benzeri diyalog pencereleri açan bir konteynerdir. JDialog sınıfı ‘javax.swing.JDialog’ paketi ile çağrılır / import edilir. Öğr.Gör. Bülent ÇOBANOĞLU Yrd. Doç.Dr. Ahmet ZENGİN Sayfa 3 3 SWING Uygulamaları-I JFrame: Diğer SWING bileşenlerini barındıran bir penceredir. JFrame sınıfı ‘javax.swing.JFrame’ paketi ile çağrılır / import edilir. JWindow: Kullanıcının masaüstünde herhangi bir yerinde görebileceği bir konteynerdir. Uygulamanızda örneğin bir başlık çubuğu, minimize, maximize butonları olmayan bir pencere oluşturmak için JWindow konteynerini kullanabilirsiniz. JWindow sınıfı ‘javax.swing.JWindow’ paketi ile çağrılır / import edilir. Swing’in sunduğu bir diğer konteyner türü ise gruplayıcı konteynerlerdir. Bunlar aynen bileşenler (components) gibi davranırlar ve iç içe birçok bu türden konteyner tanımlanabilir. Gruplayıcı konteynerlar, GUI üzerinde kullanılan JButton, JTextArea, JLabel gibi bileşenleri ve diğer gruplayıcı konteynerları gruplamak, bir arada tutmak için tasarlanmıştır. JPanel ve JTextComponent, JMenuItem gibi bileşenler bu tür konteynerlere örnek olarak verilebilir. Şekil 2. Java SWING Bileşenlerinin Hiyerarşik Yapısı. Öğr.Gör. Bülent ÇOBANOĞLU Yrd. Doç.Dr. Ahmet ZENGİN Sayfa 4 4 SWING Uygulamaları-I Temel GUI (AWT ve Swing) Bileşen ve Olayları Java ile aşağıdaki bileşenleri kullanarak grafiksel ara yüze sahip programlar geliştirilebilir. Netbeans, Eclipse veya Jbuilder gibi bir editör ile grafiksel ara yüz tasarlamak çok daha kolaydır. Örneğin Eclipse programı kullananlar http://eclipse.org/windowbuilder/download.php adresinden WindowBuilder programını kurduklarında aşağıdaki gibi hazır Java GUI bileşenlerini görebilir ve programlarında kullanabilirler. WindowBuilder programını açıklayan İngilizce dokümantasyonuna http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.wb.doc.user%2Fhtml%2Findex.html adresinden ulaşabilirsiniz. Öğr.Gör. Bülent ÇOBANOĞLU Yrd. Doç.Dr. Ahmet ZENGİN Sayfa 5 5 SWING Uygulamaları-I Fakat biz programımızda hazır araçları kullanmayacağız, bu bileşenleri kod ile oluşturacak ve programlarımızı ona göre tasarlayacağız. Programlarımızda kullanacağımız bazı AWT ve SWING bileşenleri (J harfi ile başlayanlar) ve işlevleri aşağıdaki tabloda gösterilmiştir. Bu bileşenlerin birçoğu ortak metotları kullanırlar { show(), setFont(), setLabel() , setText(), getText() gibi }. Ayrıca tüm bileşenler başta klavye ve mouse olayları olmak üzere ortak olaylara sahiptir {keyPressed() ,mouseClicked() }. Not: Tüm Swing bileşenlerini http://java.sun.com/docs/books/tutorial/ui/features/components.html adresinden inceleyebilirsiniz. Bir bileşeni java dilinde tanımlamak için aşağıdaki yapı kullanılır: Bileşen_adı değişken = new Bileşen_adi (“Başlık”); Örneğin Öğr.Gör. Bülent ÇOBANOĞLU Yrd. Doç.Dr. Ahmet ZENGİN Sayfa 6 6 SWING Uygulamaları-I Buton nesnesini eklemek için; JButton btn1=new JButton("Buton1"); Frame nesnesini eklemek için; JFrame cerceve = new JFrame("Çerçeve Başlığı"); Yapıları kullanılır. YERLEŞİM PLANI DÜZENLEYİCİLERİ (LAYOUT MANAGERS) Bir çerçeve veya pano içerisine bileşenler (butonlar, checkboxlar, vs ) yerleştirildiğinde o bileşenin çerçevenin neresine ve hangi boyutlarda yerleştirileceğine Yerleşim Planı Düzenleyicileri (Layout karar verir. Grafik uygulamalarında farklı layout yöneticileri kullanılabilir. Bunlardan bazıları; 1. FlowLayout 2. BorderLayout Bileşenler 5 alana yerleştirilir; Doğu, Batı, Güney, Kuzey ve Merkez olmak üzere. 3. GridLayout 4. GridBagLayout : GridLayout’un daha gelişmiş şeklidir, bir bileşen ızgara üzerinde birden fazla 5. 6. 7. // Bileşenler, çerçeveye satır satır ve soldan sağa doğru yerleştirilir . Bileşenler, Excel tablosuna benzer şekilde ızgaralara yerleştirilir. hücreye yerleştirilebilir. CardLayout : Bileşenler, iskambil destesinde olduğu gibi üst üste yerleştirilir. Bir anda sadece biri gözükür. BoxLayout : Bileşenleri, seçiminize göre, tek bir satır ya da sütuna (x ve y koordinatlarına göre) yerleştirir. Bileşenler çerçeveye sığmayınca bir alt satıra geçişe izin vermez. GroupLayout : Bileşenleri hiyerarşik bir şekilde sıralı ya da paralel olarak gruplar. Öğr.Gör. Bülent ÇOBANOĞLU Yrd. Doç.Dr. Ahmet ZENGİN Sayfa 7 7 SWING Uygulamaları-I Bir konteynere hangi layout manager ‘ı kullanacağını belirtmek için aşağıdaki metodu çağırın: setLayout( ); ve parametre olarak da bir layout manager ismi verin. Örneğin: BorderLayout belirtmek için: setLayout (new BorderLayout()); Burada örnek olması açısından sadece FlowLayout ve GridLayout ‘u açıklayacağız. FlowLayout ile bileşenler, çerçeve içerisine satır satır ve sıra ile yerleştirilir. Layout yöneticisini, setLayout( ) yöntemini kullanarak aşağıdaki gibi tanımlıyoruz; setLayout(new FlowLayout() ); GridLayout ile kontrol nesnelerini Excel tablosuna benzer şekilde hücrelere (satır ve sütunlara) yerleştiriyoruz. Kullanım şekli; setLayout(new GridLayout(satır_sayisi, sütun_sayisi)); Örnek 1. Şekildeki gibi bir form üzerine programlama dillerini buton olarak yerleştiren Applet kodunu yazınız. Çözüm: import java.awt.FlowLayout; import javax.swing.*; public class Ornek3 extends JApplet { public void init() { setLayout(new FlowLayout() ); JButton b1 = new JButton( "Java" ); JButton b2 = new JButton( "Visual Basic" ); JButton b3 = new JButton( "C#" ); add( b1 ); add( b2 ); add( b3 ); } } Öğr.Gör. Bülent ÇOBANOĞLU Yrd. Doç.Dr. Ahmet ZENGİN Sayfa 8 8 SWING Uygulamaları-I Örnek 2: Aynı programı Applet kullanmadan bir frame üzerinde gerçekleştiriniz. Çözüm: Bu örnekte Applet kullanmadan main metoduna kodu yazacağız. import java.awt.FlowLayout; import javax.swing.*; public class Ornek4 { public static void main(String[] args) { JFrame Cerceve = new JFrame("Frame Örnegi"); Cerceve.setLayout(new FlowLayout()); JButton b1 = new JButton("Java"); JButton b2 = new JButton("Visual Basic"); JButton b3 = new JButton("C#"); // Butonlar çerçeveye yerleştirilir Cerceve.add(b1); Cerceve.add(b2); Cerceve.add(b3); Cerceve.setVisible(true);// Çerçeveyi ekranda gösterir Cerceve.pack(); // Nesneleri çerçeve boyutuna göre otomatik // boyutlandırır } } Örnek 3: Birçok web sitesinde karşılaştığımız “kullanıcı adı” ve “şifre” soran şekildeki gibi bir şifre ekranını GridLayout yöntemi ile yapalım. Öğr.Gör. Bülent ÇOBANOĞLU Yrd. Doç.Dr. Ahmet ZENGİN Sayfa 9 9 SWING Uygulamaları-I 10 Çözüm: import java.awt.GridLayout; import javax.swing.*; public class SifreEkrani extends JPanel { public static void main(String[] args) { JTextField password, username; password = new JTextField(10); username = new JTextField(10); JFrame Cerceve = new JFrame("Sifre Ekranı Örneği"); Cerceve.setLayout(new GridLayout(2, 2)); // 2 sutunlu 1. satır Cerceve.add(new JLabel("Kullanıcı Adı:")); Cerceve.add(username); // 2 sutunlu 2. satır Cerceve.add(new JLabel("Şifre")); Cerceve.add(password); Cerceve.setSize(300, 200); //Çerçeve boyutu ayarlanıyor Cerceve.setVisible(true); //Çerçeve ekranda gösteriliyor Cerceve.pack(); //Nesneler çerçeve boyutuna göre yerleştiriliyor } } Örnek 4: Otomobil özelliklerini şekildeki gibi veren programı yazınız. Çözüm: import java.awt.*; import javax.swing.*; class Oto { public static void main(String[] args) { JFrame frame = new JFrame("Otomobil Özellikleri"); frame.setLayout(new FlowLayout()); JCheckBox oto1 = new JCheckBox("ABS"); oto1.setSelected(true); // ABS seçildi JCheckBox oto2 = new JCheckBox("CD Çalar"); JCheckBox oto3 = new JCheckBox("Hava yastigi"); JCheckBox oto4 = new JCheckBox("Klima"); oto4.setSelected(true); // Klima seçildi Öğr.Gör. Bülent ÇOBANOĞLU Yrd. Doç.Dr. Ahmet ZENGİN Sayfa 10 SWING Uygulamaları-I 11 frame.add(oto1); frame.add(oto2); frame.add(oto3); frame.add(oto4); frame.pack(); // Çerçeveyi, nesnelerin boyutuna göre ayarlar frame.setVisible(true); } } Örnek 5: Cinsiyet seçimini şekildeki gibi yapan programı yazınız. import javax.swing.*; import java.awt.*; public class Cinsiyet extends JFrame { public static void main(String[] arg) { JFrame Cerceve = new JFrame("Cinsiyetiniz?"); Cerceve.setLayout(new FlowLayout()); JRadioButton cb1 = new JRadioButton("Erkek"); JRadioButton cb2 = new JRadioButton("Bayan"); cb2.setSelected(true);// Başlangıçta Bayan seçili olsun Cerceve.add(cb1); Cerceve.add(cb2); Cerceve.setVisible(true); //Çerçeve ekranda gösteriliyor Cerceve.setSize(250, 80); //Çerçeve boyutu ayarlanıyor } } Örnek 6: Klavyeden girilen bir ismi hem konsolda hemde grafiksel ekranda gösteren Applet uygulamasını yapınız. import import import public java.awt.*; javax.swing.JApplet; javax.swing.JOptionPane; class sss extends JApplet { String ad; public void init() { ad = JOptionPane.showInputDialog(null, "Ad Giriniz"); System.out.println("Girilen isim: " + ad); } public void paint(Graphics g) { g.setColor(Color.red); g.drawString(ad, 50, 50); } } Öğr.Gör. Bülent ÇOBANOĞLU Yrd. Doç.Dr. Ahmet ZENGİN Sayfa 11 SWING Uygulamaları-I 12 Programın ekran çıktısı aşağıdaki gibi olur: Klavyeden ‘Bulent’ girildiğinde hem konsola hem de grafiksel ekrana yazıldığını görürüz. Öğr.Gör. Bülent ÇOBANOĞLU Yrd. Doç.Dr. Ahmet ZENGİN Sayfa 12 SWING İle GRAFİKSEL SWING Uygulamaları-I 13 UYGULAMALAR-II Hedefler Bu üniteyi çalıştıktan sonra; Java olaylarını ve dinleyici metotlarını öğreneceksiniz, Hareket bağımlı uygulamalar geliştirebileceksiniz, Öğr.Gör. Bülent ÇOBANOĞLU Yrd. Doç.Dr. Ahmet ZENGİN Sayfa 13 SWING Uygulamaları-I 14 İçindekiler SWING ile GRAFİKSEL KULLANICI ARAYÜZÜ (GUI) PROGRAMLAMA -II Giriş Olaylar (Events) ve Dinleyici (Listener) Metotları, Bazı Sık Kullanılan Olaylar ve Dinleyicileri Örnek Uygulamalar Değerlendirme Soruları Öğr.Gör. Bülent ÇOBANOĞLU Yrd. Doç.Dr. Ahmet ZENGİN Sayfa 14 SWING Uygulamaları-I 15 Olaylar (Events) ve Dinleyici (Listener) Metotları Giriş Grafiksel ara yüz (GUI), pencereler, butonlar, menüler, etiketler, metin kutucukları gibi grafik bileşenleri (components) içerir. Bu bileşenler ile kullanıcının etkileşim kurması veya olaylara cevap vermesi, “butona tıklanması”, “menüden bir seçenek seçilmesi”, “metin kutusuna veri girilmesi” şeklinde gerçekleşir. Sistem, kullanıcının her etkileşiminde bir olay (“event”) üretir. Ve; Bileşenler bu olaylardan haberdar edilirler. Her bileşen kendi olayına göre olay dinleyici olarak kendini tanıtmakla ve ilgili ara yüzü tanımlamakla yükümlüdür. Java dilinde olaylar “Event”, dinleyiciler ise “Listener” deyimi ile ifade edilir. Kullanıcının program ile görsel iletişim kurduğu programlar hareket bağımlı (event-driven) programlardır. Bir uygulama, bir olaya / harekete bağlı bir kod üretecekse “java.awt.event.*” paketini programın başında çağırmamız gerekir. Hareket bağımlı (olay tabanlı) bir uygulama üç bileşene sahiptir. Bunlar; 1. Olay kaynağını oluşturan bileşenler (Grafiksel Kullanıcı Ara yüzü oluşturan nesnelerdir), 2. Uygulama metotları (İşlemleri gerçekleştiren kodlardır). 3. Olayları alan ve onlara cevap veren dinleyici (Listener) metotları, Örneğin bir web tarayıcı (Internet Explorer gibi) programı kontrol bileşenlerine (örneğin ileri, geri butonları) , olayları tutan dinleyici metotlara (örneğin “geri” butonuna click yapılması gibi) ve işlemleri gerçekleştiren uygulama metotlarına ( bir sayfada ileri, geri gezinti gibi) sahiptir. Programcı olay gerçekleştiğinde çalışacak kodu (olay işleyici- event handler) yazmalıdır. Her olay işleyici (“event handler”) aşağıdaki kodları içerir. a. Sınıfa ait bir dinleyici ara yüz; “ public class SinifAdi implements ActionListener {“ b. Olay kaynağını oluşturan bileşenler için olay dinleyicileri yerleştirilir; “bilesenAdi.addActionListener ( this)” c. Olay işleyici sınıfın içinde, dinleyici (“Listener”) arayüzünün yöntemleri gerçekleştirilir; “public void actionPerformed (ActionEvent e) { … }” Öğr.Gör. Bülent ÇOBANOĞLU Yrd. Doç.Dr. Ahmet ZENGİN Sayfa 15 SWING Uygulamaları-I 16 Genel olarak kontrol bileşenlerinin alanlarına set / get metotlarıyla ulaşılabilir. Bu alanları değiştirerek bileşenin belli bir davranışta bulunması sağlanabilir. Bileşenlerin program çalışırken bazı olaylara (event) yanıt vermesi gerekir. Bazı Sık Kullanılan Olaylar ve Dinleyicileri ActionEvent olayı: Bir butona basıldığında, Enter tuşuna basıldığında veya menülerden bir seçim yapıldığında ActionEvent olayı oluşur. Olaylar, kullanıcı tarafından yazılan dinleyiciler (listener) tarafından yakalanabilir. Dinleyiciler, bir bileşene, belli bir olay türü için eklenir. ActionEvent olayı programcı tarafından bir ActionListener ile dinlenebilir. Bir dinleyici birden fazla kontrol bileşenini aynı anda dinleyebilir. ActionListener ile dinlenen olay kaynağında bir olay olduğunda (yani ActionEvent gerçekleştiğinde) çalışacak kod, actionPerformed metoduna yazılmalıdır. ItemEvent olayı: Bir bileşen seçildiğinde ya da seçim kaldırıldığında gerçekleşen bir olaydır. Benzer şekilde ItemEvent olayı programcı tarafından ItemListener ile dinlenebilir ve ItemListener ile dinlenen olay olduğunda çalışacak kod, itemStateChanged metoduna yazılmalıdır. KeyEvent olayı: Klavye olaylarının ele alındığı bir sınıftır. Klavyede herhangi bir tuşa basıldığında ya da tuş serbest bırakıldığında keyEvent oluşur. keyEvent oluştuğunda bu sınıf, keyListener ile dinlenir ve keyListener ile dinlenen olay keyPressed (tuşa basıldığında), keyReleased (basılan tuş bırakıldığında), keyTyped (ekrana bir karakter yazılmak istendiğinde) gibi ilgili metoda yazılmalıdır. MouseEvent olayı: Fare / Mouse hareketi gerçekleştiğinde mouseEvent olayı gerçekleşir. mouseEvent oluştuğunda bu sınıf, mouseListener ile dinlenebilir ve mouseListener ile dinlenen olay mousePressed, mouseReleased, mouseCliked, mouseEntered gibi ilgili metoda yazılan kod ile çalıştırılır. Örneğin fare ile çizim v.b. isler yapılacaksa o zaman fare tarafından tetiklenen olaylar ele alınabilir. MouseEvent nesnesinin getX ve getY metotları kullanılarak fare işaretcisinin bastığı yer bilgisi elde edilebilir. Örneğin kullanıcı bir fare tuşuna bastığında ve bıraktığında aşağıdaki MouseListener metotları tetiklenir. Tetiklenen olayların metotları ( ) aşağıdaki gibi tanımlanır: - public public public public public void void void void void mousePressed(MouseEvent e) {}; mouseReleased(MouseEvent e) {}; mouseClicked(MouseEvent e) {}; mouseEntered(MouseEvent e) {}; mouseExited(MouseEvent e) {}; Öğr.Gör. Bülent ÇOBANOĞLU Yrd. Doç.Dr. Ahmet ZENGİN Sayfa 16 SWING Uygulamaları-I 17 Örnek Uygulamalar-x Örnek x: Butona basıldığında mesaj veren basit bir uygulama import java.awt.event.*; import javax.swing.JApplet; import javax.swing.JButton; import javax.swing.JOptionPane; public class ButonMesaj extends JApplet implements ActionListener { JButton btn1=new JButton("Buton"); public void init() { btn1.addActionListener(this); add(btn1); } public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(null,"Butona basıldı"); } } Örnek 1: Butona tıklandığında butonun başlığını(textini) değiştiren basit bir applet programı ve ekran çıktısı aşağıda görülmektedir. Çözüm: Dikkat ederseniz, bu uygulamada olay kaynağı buton (btn1) bileşenidir, olay kaynağını ‘btn1.addActionListener(this)’ deyimi ile dinliyoruz ve olay gerçekleştiğinde yapılacak işlemleri ‘actionPerformed(ActionEvent e)’ metoduna yazıyoruz. Buton nesnesini ‘JButton btn1=new JButton("OFF");’ komut satırı ile oluşturuyoruz. Butonu uygulama üzerine ‘add(btn1);’ komut satırı ile ekliyoruz. Butonun başlığını ‘getText()’ metodu ile alıyoruz, ‘setText’ metodu ile de değiştiriyoruz / yeni değere set ediyoruz. import java.awt.event.*; import javax.swing.JApplet; import javax.swing.JButton; public class Ornek1 extends JApplet implements ActionListener { JButton btn1=new JButton("OFF"); public void init() { btn1.addActionListener(this); add(btn1); } public void actionPerformed(ActionEvent e) { String ad=btn1.getText(); if(ad.equals("ON")) btn1.setText("OFF"); else btn1.setText("ON"); Öğr.Gör. Bülent ÇOBANOĞLU } } Yrd. Doç.Dr. Ahmet ZENGİN Sayfa 17 SWING Uygulamaları-I 18 NOT: Uygulama için gerekli nesneler (Buton) ve butonu dinlemek içinde ActionListener (Olay Dinleyicisi) nesnesi eklenir. Bu ActionListener ‘in da actionPerformed() (Olay gerçekleşti) metoduna düğmeye basıldığında yapılacak gerekli işlemler yazılır. Örnek 2: Seçilen takım renklerine göre tuttuğunuz takımı söyleyen bir uygulamayı yazınız. { Programda renkler (Sarı, Kırmızı, Lacivert) 3 adet JCheckBox bileşeni ile gösterilecek ve seçilen renge göre takım konsol ekranına yazılacak} Çözüm: import java.awt.FlowLayout; import java.awt.event.*; import javax.swing.*; public class Test extends JFrame implements ActionListener { public static void main(String[] arg) { Test cerceve = new Test(); cerceve.setVisible(true); // Kapatma 'X' butonuna basıldığında çerçevenin kapanması için cerceve.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } JCheckBox chk1; JCheckBox chk2; JCheckBox chk3; public Test() { setLayout(new FlowLayout()); chk1 = new JCheckBox("Sarı"); add(chk1); chk1.addActionListener(this); chk2 = new JCheckBox("Kırmızı"); add(chk2); chk2.addActionListener(this); chk3 = new JCheckBox("Lacivert"); add(chk3); chk3.addActionListener(this); pack(); Öğr.Gör. Bülent ÇOBANOĞLU Yrd. Doç.Dr. Ahmet ZENGİN Sayfa 18 SWING Uygulamaları-I 19 } public void actionPerformed(ActionEvent e) { if (chk1.isSelected() & chk2.isSelected()) System.out.println("Galatasaray"); if (chk1.isSelected() & chk3.isSelected()) System.out.println("Fener"); } } Programın ekran çıktısı aşağıdaki gibi olacaktır: Örnek 3: Tavlada zar atan ve atılan zarlara göre puan veren şekildeki gibi bir Applet uygulamasını yapınız. { Program, eğer atılan zarlardan biri 6 veya iki zarda birbirine eşit ise 2 değilse 1 puan verecek} Çözüm: import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Zar extends JApplet implements ActionListener { private JButton atButonu; Öğr.Gör. Bülent ÇOBANOĞLU Yrd. Doç.Dr. Ahmet ZENGİN Sayfa 19 SWING Uygulamaları-I 20 int sayac=0; private boolean atis = false; public void init() { atButonu = new JButton("Zarı At"); add(atButonu); atButonu.addActionListener(this); } public void actionPerformed(ActionEvent e) { atis = true; repaint(); } public void paint(Graphics g) { int zar1, zar2; if (atis) { zar1 = (int) (Math.random() * 6) + 1; zar2 = (int) (Math.random() * 6) + 1; g.drawString("zarlar " + zar1 + " ve " + zar2, 20, 40); if (zar1 == zar2 || zar1 == 6) { sayac+=2; g.drawString(sayac + " puan: "+ "\ndüşeeeş..Tebrikler, şimdi 2 el oyna", 20, 60); } else { g.drawString(sayac + " puan: "+ "\niyisin iyisin.. devam et", 20, 60); sayac++; } } } } Örnek 4: Girilen not değerine göre ekranda “geçtiniz” veya “kaldınız” şeklinde mesaj veren Applet uygulamasını yapınız { Uygulamayı SWING yerine AWT bileşenleri ile gerçekleştiriniz.} Çözüm: import import import public java.awt.*; java.applet.*; java.awt.event.*; class Not extends Applet implements ActionListener { TextField kutucuk; int not; public void init() { kutucuk = new TextField(10); add(kutucuk); kutucuk.addActionListener(this); } public void actionPerformed(ActionEvent olay) { not = Integer.parseInt(kutucuk.getText()); repaint(); // paint metodunu yeniler } Öğr.Gör. Bülent ÇOBANOĞLU Yrd. Doç.Dr. Ahmet ZENGİN Sayfa 20 SWING Uygulamaları-I 21 public void paint(Graphics g) { g.drawString("Notunuz : " + not, 50, 50); if (not != 0) { if (not < 50) g.drawString("kaldınız...", 50, 100); else g.drawString("geçtiniz...", 50, 100); } } } TextField elemanına girilen değerlere göre programın ekran çıktısı aşağıdaki gibi olur: Örnek 5. İki sayının toplamını şekildeki gibi gerçekleştiren bir java applet kodunu yazınız. Çözüm: import import import public java.awt.*; java.awt.event.*; javax.swing.*; class Ornek7 extends JApplet implements ActionListener { int Toplam = 0; JLabel lbl1 = new JLabel("Birinci Sayi"); // 1. satır GUI elemanları JTextField txt1 = new JTextField(); JLabel lbl2 = new JLabel("İkinci sayi"); // 2. satır GUI elemanları TextField txt2 = new TextField(); JButton btn1 = new JButton("Hesapla"); // 3. satır GUI elemanları JLabel lbl3 = new JLabel(); public void init() { // 3 satır, 2 sütundan oluşan bir ızgara(grid)tanımlandı setLayout(new GridLayout(3, 2)); add(lbl1);// Birinci satır GUI elemanları eklendi Öğr.Gör. Bülent ÇOBANOĞLU Yrd. Doç.Dr. Ahmet ZENGİN Sayfa 21 SWING Uygulamaları-I 22 add(txt1); add(lbl2);// İkinci satır GUI elemanları eklendi add(txt2); add(btn1);// Ücüncü satır GUI elemanları eklendi add(lbl3); btn1.addActionListener(this); } public void actionPerformed(ActionEvent evt) { int s1 = Integer.parseInt(txt1.getText()); int s2 = Integer.parseInt(txt2.getText()); Toplam = s1 + s2; lbl3.setText(Integer.toString(Toplam)); } } Örnek 6. Şekildeki gibi (toplama, çıkarma, çarpma, bölme, üs alma) işlemlerini gerçekleştiren basit bir hesap makinesi applet uygulamasını yapınız. Çözüm: import import import public { java.applet.*; java.awt.*; java.awt.event.*; class HesapMakinesi extends Applet implements ActionListener private private private private private private private private private private private private Button Topla; Button Cikar; Button Carp; Button Bol; Button Us; Button Sil; TextField kutu1; TextField kutu2, kutu3; Label etiket; double sayi1; double sayi2; double sonuc = 0; public void init() { setLayout(new GridLayout(5, 2)); Topla = new Button("+"); Cikar = new Button("-"); Carp = new Button("*"); Bol = new Button("/"); Us = new Button("^"); Sil = new Button("CE"); kutu1 = new TextField(10); Öğr.Gör. Bülent ÇOBANOĞLU Yrd. Doç.Dr. Ahmet ZENGİN Sayfa 22 SWING Uygulamaları-I 23 kutu2 = new TextField(10); kutu3 = new TextField(10); etiket = new Label(" = "); add(kutu1);// 1. satır add(kutu2); add(Topla);// 2. satır add(Cikar); add(Carp);// 3.satır add(Bol); add(Us);// 4. satır add(Sil); add(etiket);// 5. satır add(kutu3); // Global olarak tanımlanmış değişkene this deyimi ile erişiyoruz Topla.addActionListener(this); Cikar.addActionListener(this); Carp.addActionListener(this); Bol.addActionListener(this); Us.addActionListener(this); Sil.addActionListener(this); } public void actionPerformed(ActionEvent e) { sayi1 = Double.parseDouble(kutu1.getText()); sayi2 = Double.parseDouble(kutu2.getText()); if (e.getSource() == Topla) sonuc = sayi1 + sayi2; if (e.getSource() == Cikar) sonuc = sayi1 - sayi2; if (e.getSource() == Carp) sonuc = sayi1 * sayi2; if (e.getSource() == Bol) sonuc = sayi1 / sayi2; if (e.getSource() == Us) sonuc = Math.pow(sayi1, sayi2); if (e.getSource() == Sil) { kutu1.setText(""); kutu2.setText(""); } repaint();// paint metodunu yeniler } public void paint(Graphics g) { kutu3.setText("" + sonuc); } } Sıra Sizde Bir çerçeve içerisine her mouse (fare) tıklamasında sırası ile içi dolu kırmızı renkli kare, yeşil renkli daire ve siyah renkte “Merhaba” yazan programı yazınız. Öğr.Gör. Bülent ÇOBANOĞLU Yrd. Doç.Dr. Ahmet ZENGİN Sayfa 23 SWING Uygulamaları-I 24 KAYNAKÇA “Bülent Çobanoğlu”, Java ile Programlama ve Veri Yapıları, 2. Baskı, ISBN:978-9944-711-10-4, Sayfa 521, 377-394 DEĞERLENDİRME SORULARI S1. Hareket bağımlı (olay tabanlı) bir uygulama üç bileşene sahiptir. Bunlar nelerdir? S2. Bir butona basıldığı zaman hangi olay gerçekleşir? S3. Bir Applet uygulamasında hareketleri (butona tıklanması, Mouse hareketi gibi) yakalamak için hangi paketinin program başında import edilmesi gerekir? S4. Bir çerçeve veya pano içerisine bir kontrol nesnesi (butonlar gibi) yerleştirildiğinde o nesnenin çerçevenin neresine ve hangi boyutlarda yerleştirileceğine hangi yöntem karar verir? Öğr.Gör. Bülent ÇOBANOĞLU Yrd. Doç.Dr. Ahmet ZENGİN Sayfa 24 SWING Uygulamaları-I 25 KONUNUN ÖZETİ Java’nın ilk geliştirdiği GUI kütüphanesinin ismi AWT dir. Ancak Java 2 platformu ile birlikte AWT yetersiz görülmüş ve çok daha geniş ve gelişmiş özelliklere sahip SWING Kütüphanesi ( AWT ye göre yüzlerce yeni sınıfın eklendiği ) sisteme eklenmiştir. Swing bileşenleri, AWT bileşenleri ile aynı ismi taşırlar, tek fark J harfi ile başlamalarıdır (Button JButton, Label JLabel, CheckBox JCheckBox gibi ) diyebiliriz. Grafiksel kullanıcı ara yüzü oluşturmak ve uygulama geliştirmek için java.awt ve javax.swing olmak üzere iki temel bileşen kümesindeki paketler kullanılır. SWING bileşenlerinin hiyerarşik yapısındaki sınıfları açıklayacak olursak, en üst (top level) seviyede barındırıcı (container-konteyner) sınıflar bulunur. Konteynerler diğer bileşenleri içinde barındırabilen özel bileşenlerdir. Bu bileşenler JApplet, JDialog, JFrame, JWindow’ dur. Bir bileşeni java dilinde tanımlamak için aşağıdaki yapı kullanılır: Bileşen_adı değişken = new Bileşen_adi (“Başlık”); Örneğin Buton nesnesini eklemek için; JButton btn1=new JButton("Buton1"); Bir çerçeve veya pano içerisine bileşenler (butonlar, checkboxlar, vs ) yerleştirildiğinde o bileşenin çerçevenin neresine ve hangi boyutlarda yerleştirileceğine Yerleşim Planı Düzenleyicileri (Layout karar verir. Grafik uygulamalarında farklı layout yöneticileri kullanılabilir. Bunlardan bazıları; DEĞERLENDİRME SORULARI S1. Bir çerçeve veya pano içerisine bir kontrol nesnesi (butonlar gibi) yerleştirildiğinde o nesnenin çerçevenin neresine ve hangi boyutlarda yerleştirileceğine hangi yöntem karar verir? S2. Layout yönetimi çeşitleri nelerdir? İsimlerini yazınız. S3. Sırası ile şekildeki Swing bileşenlerinin eleman isimlerini söyleniz? Öğr.Gör. Bülent ÇOBANOĞLU Yrd. Doç.Dr. Ahmet ZENGİN Sayfa 25 SWING Uygulamaları-I 26 S4. Javanın ilk geliştirdiği GUI kütüphanesinin ismi nedir? S5. SWING’in AWT’ye göre üstünlüklerini yazınız? KAYNAKÇA “Bülent Çobanoğlu”, Java ile Programlama ve Veri Yapıları, 2. Baskı, ISBN:978-9944-711-10-4, Sayfa 521, 377-394 Öğr.Gör. Bülent ÇOBANOĞLU Yrd. Doç.Dr. Ahmet ZENGİN Sayfa 26