İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır

Component'ler

Component Kavramı

Kullanıcıdan bir bilgi almak için kullanılan görsel nesnelere 'component' denir. Button, TextField, CheckBox gibi component'ler bulunmaktadır. Bütün component'ler AWT içerisinde bulunan Component adlı class'ı extend eder. Bu class bütün bileşenlerde bulunan yazı rengi, boyutlar gibi property'ler ve çeşitli method'lar içerir.

Container Class'ı

Bir veya daha çok component içeren component'ler Container'lardır. Container'ın içine konan component'ler belli bir layout manager tarafından yerleştirilir. Aslında Frame içerisine konan componentler de Frame'in içerisindeki container'a konur. Container'ler da aslında birer component'tir. Yani Container class'ı Component class'ını extend eder.

Panel Class'ı

Container class'ı içerisinde bir veya daha çok component bulundurabilen bileşen olmakla birlikte, programcıların bu class'ı extend eden Panel adlı class'ın bu amaçla kullanılması gerekir.

Canvas Class'ı

Üzerinde çizim veya image işlemleri yapmak için kullanılması uygun olan component Canvas'dır. Çizim yapmak için Component'teki paint() method'u override edilir :

	public void paint(Graphics g){
		g.drawLine(100,100,300,300)		
	}

Button (Düğme)

En çok kullanılan componentler'den biri olan Button, üzerinde bir etiket (label) bulunan, fareyle tıklandığında basıldığı izlenimi veren ve bir ActionEvent üreten arayüz elemanıdır. AWT paketinde Toolbar (araç çubuğu) yoktur, ancak bir panele bir kaç düğme eklenerek çok kolay aynı işlevsellik elde edilebilir.

Telefonunun arayüzünü emüle eden bir pencere yapalım. Bu uygulama düğmelerden birine basılarak yazılan numarayı güya arasın. İşlem, hangi düğmeye basılıdığını anlamak, eğer "Yes" gibi kontrol tuşuysa bir işlem yapmak, "1","2","3" gibi numaraysa diplay'da göstermekten ibarettir. PhoneSimulatorFrame class'ı implements ActionListener diyerek ve actionPerformed() methodunu yazarak düğmeleri dinleyebilme özelliği kazanmıştır. Düğmelere kendisini button.addActionListener(this) şeklinde kaydettirir. Hangi düğmeye basıldığını event'in source'undan öğrenmektedir.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 import java.awt.*;
  2 import java.awt.event.*;
  3 public class PhoneSimulatorFrame
  4   extends Frame
  5   implements ActionListener
  6 {
  7   private TextField display=null;
  8   public PhoneSimulatorFrame() {
  9     setBounds(100,100,100,200);
 10     setLayout(new BorderLayout());
 11     display=new TextField("");
 12     add(display,BorderLayout.NORTH);
 13     Panel buttons=createButtonsPanel();
 14     add(buttons,BorderLayout.CENTER);
 15   }
 16   public void actionPerformed(ActionEvent event){
 17     Button button=(Button)event.getSource();
 18     String label=button.getLabel();
 19     if(label.equals("Yes")){
 20       String text=display.getText();
 21       if(text.length()==7 || text.length()==11){
 22         System.out.println("Calling "+text);
 23       }else{
 24         System.out.println("Error!");
 25       }
 26     }else if(label.equals("C")){
 27       display.setText("");
 28     }else if(label.equals("No")){
 29       display.setText("");
 30       System.out.println("Cancelled.");
 31     }else{
 32       String text=display.getText();
 33       text=text+label;
 34       display.setText(text);
 35     }
 36   }
 37   private Panel createButtonsPanel(){
 38     Panel buttons=new Panel(new GridLayout(5,3));
 39     addButton(buttons,"Yes");
 40     addButton(buttons,"C");
 41     addButton(buttons,"No");
 42     addButton(buttons,"1");
 43     addButton(buttons,"2");
 44     addButton(buttons,"3");
 45     addButton(buttons,"4");
 46     addButton(buttons,"5");
 47     addButton(buttons,"6");
 48     addButton(buttons,"7");
 49     addButton(buttons,"8");
 50     addButton(buttons,"9");
 51     addButton(buttons,"*");
 52     addButton(buttons,"0");
 53     addButton(buttons,"#");
 54     return buttons;
 55   }
 56   private void addButton(Panel panel,String label){
 57     Button button=new Button(label);
 58     button.addActionListener(this);
 59     panel.add(button);
 60   }
 61   public static void main(String[] args){
 62     PhoneSimulatorFrame frame=new PhoneSimulatorFrame();
 63     frame.setVisible(true);
 64   }
 65 }

Burada frame sadece button'ları dinlediği için event'in source'u Button'a cast edilmiştir. Eğer başka bileşenleri de dinleseydi source'un Button olup olmadığını kontrol etmemiz gerekirdi. Bunun için bir nesnenin belli bir class'ın veye subclass'ının bir instance'ı olup olmadığını kontrol eden instanceof operatörü kullanılır. Örnekteki actionPerformed() aşağıdakine uygun olarak değiştirilmelidir.

Object source=event.getSource();
if(source instanceof Button){
	Button button=(Button) source;
}

TextArea

Bir kaç satırdan oluşan metin girişi için kullanılır. İçerisindeki text'in tamamı ve seçilmiş kısmıyla ilgili bir çok method içerir.

TextField

Tek satırlık bilgi girişi için bu component kullanılır. TextArea'dan bir farkı da Enter'a basıldığında ActionEvent'i üretebilmesidir.

Label

Kullanıcının değiştiremeyeceği tek satırlık metin için kullanılır. İşlevi ekranda belli bir yazıyı sergilemekten ibarettir.

Checkbox

Kullanıcının bir konudaki tercihini öğrenmek için kullanılır. Birden fazla Checkbox bir CheckboxGroup'a eklenirse, sadece aynı anda sadece birinin seçili olabildiği radio button olarak çalışır.

List

Kullanıcının bir liste içerisinden herhangi birini seçmesi için kullanılır. Bir veya daha fazla maddenin seçilmesine olanak tanır. Bir elemanın üzerinde çift tıklama durumunda çok eleman seçilmiş olur.

Choice

Birden fazla elemanın tıklamayla açılan bir listeden eleman seçilmesine olanak tanıyan bileşendir. Ekranda sadece seçili olan elamanı gösterir.

Form Örneği

Çok kullanılann bileşenleri içeren bir form örneği yapalım. Tamam düğmesine basılınca kullanıcının girdiği değerleri ekrana bassın. Burada sadece düğmenin ürettiği ActionEvent dinlenmektedir. Aslında Checkbox,Choice ve TextField'ları da dinlemek mümkündür. Ama o durumda kullanıcının bilgi girişi bitmeden bir tepki verilir ki, form türü bilgi girişlerinde bu pek doğru olmaz.

Burada her component grubu ayrı bir panel'e konmuş, daha sonra bütün paneller ana pencereye yerleştirilmiştir. Bu şekilde sadece GirdBagLayout, GridLayout ve BorderLayout kullanılarak karmaşık bir form yapılabilmiştir.

Insets class'ı her bileşenin etrafında kendisine ayrılan yerden bırakılacak aralığı belirler. Bu şekilde bileşenlerin kendi alanlarını tamamen doldurması, birbirlerine ve en dış sınırlara yapışması engellenmiş olur.

Bir başka önemli konu da, düğmelere ActionListener eklenmesinin anonymous inner class'larla gerçekleştirlmiş olmasıdır. Bu şekilde ayrı bir listener class'ı yapmaya gerek duymadan ya da asıl class'ın ActionListener'ı implement etmeye mecbur bırakmadan düğmeleri dinlemiş olduk. Ayrıca birden fazla bileşenin dinlenmesine rağmen actionPerformed() methodunda hangi düğmeye basıldığını anlamak için herhangi bir ayıklma yapmak zorunda kalmadık. "OK" ve "Cancel" düğmeleri ayrı ayrı dinlenmektedir.

Dikkat edildiyse örnekte bazı bileşenler class'da property olarak tutulmuştur. Bunun nedeni, tanımlandıkları method dışında da erişilebilmelerini sağlamaktır. Aksi taktirde her değişkenin içinde bulunduğu '{' ve '}' scope'unun dışında tanınmaması yüzünden bu bileşenlere ve içerisindeki verilere erişemeyebilirdik.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 import java.awt.*;
  2 import java.awt.event.*;
  3 public class ComponentFormSample
  4   extends Frame
  5 {
  6   private TextField name=new TextField();
  7   private CheckboxGroup gender=new CheckboxGroup();
  8   private Checkbox[] hobbies=new Checkbox[3];
  9   private Choice education=new Choice();
 10   private TextArea description=new TextArea();
 11   public ComponentFormSample() {
 12     setFont(new Font("Arial",Font.BOLD,12));
 13     setBackground(Color.lightGray);
 14     setBounds(100,100,300,500);
 15     setLayout(new GridBagLayout());
 16     Label label=new Label("INFORMATION FORM",Label.CENTER);
 17     addPart(label,1,1);
 18     Panel names=createNamesPanel();
 19     addPart(names,2,1);
 20     Panel genders=createGendersPanel();
 21     addPart(genders,3,1);
 22     Panel hobbies=createHobbiesPanel();
 23     addPart(hobbies,4,4);
 24     Panel education=createHobbiesPanel();
 25     addPart(hobbies,8,1);
 26     Panel descriptions=createDescriptionsPanel();
 27     addPart(descriptions,9,1);
 28     Panel buttons=createButtonsPanel();
 29     addPart(buttons,10,1);
 30   }
 31   public Insets insets(){
 32     return new Insets(25,15,15,15);
 33   }
 34   private void addPart(Component part,int row,int height){
 35     GridBagConstraints constraints=new GridBagConstraints();
 36     constraints.gridx=0;
 37     constraints.gridy=row;
 38     constraints.gridwidth=1;
 39     constraints.gridheight=height;
 40     constraints.weightx=1.0;
 41     constraints.weighty=1.0;
 42     constraints.fill=GridBagConstraints.BOTH;
 43     constraints.insets=new Insets(5,0,5,0);
 44     add(part,constraints);
 45   }
 46   private Panel createNamesPanel(){
 47     Panel panel=new Panel(new GridLayout(1,2));
 48     panel.add(new Label("Full Name "));
 49     panel.add(name);
 50     return panel;
 51   }
 52   private Panel createGendersPanel(){
 53     Panel panel=new Panel(new GridLayout(1,3));
 54     Checkbox male=new Checkbox("Male",gender,true);
 55     Checkbox female=new Checkbox("Female",gender,false);
 56     panel.add(new Label("Gender"));
 57     Panel boxes=new Panel(new GridLayout(1,2));
 58     boxes.add(male);
 59     boxes.add(female);
 60     panel.add(boxes);
 61     return panel;
 62   }
 63   private Panel createHobbiesPanel(){
 64     Panel panel=new Panel(new GridLayout(4,1));
 65     panel.add(new Label("Hobbies"));
 66     hobbies[0]=new Checkbox("Computer",true);
 67     panel.add(hobbies[0]);
 68     hobbies[1]=new Checkbox("Music",false);
 69     panel.add(hobbies[1]);
 70     hobbies[2]=new Checkbox("Art",false);
 71     panel.add(hobbies[2]);
 72     return panel;
 73   }
 74   private Panel createEducationPanel(){
 75     Panel panel=new Panel(new GridLayout(1,2));
 76     education.add("Primary");
 77     education.add("Secondary");
 78     education.add("High School");
 79     panel.add(new Label("University"));
 80     panel.add(education);
 81     return panel;
 82   }
 83   private Panel createDescriptionsPanel(){
 84     Panel panel=new Panel(new BorderLayout());
 85     Label label=new Label("Description");
 86     panel.add(label,BorderLayout.NORTH);
 87     panel.add(description,BorderLayout.CENTER);
 88     return panel;
 89   }
 90   private Panel createButtonsPanel(){
 91     Panel panel=new Panel(new GridLayout(1,2));
 92     Button ok=new Button("OK");
 93     ok.addActionListener(
 94       new ActionListener(){
 95         public void actionPerformed(ActionEvent e){
 96           printData();
 97           setVisible(false);
 98         }
 99       }
100     );
101     panel.add(ok);
102     Button cancel=new Button("Cancel");
103     cancel.addActionListener(
104       new ActionListener(){
105         public void actionPerformed(ActionEvent e){
106           setVisible(false);
107         }
108       }
109     );
110     panel.add(cancel);
111     return panel;
112   }
113   private void printData(){
114     System.out.println("# Name :"+name.getText());
115     System.out.println("# Gender :"+gender.getSelectedCheckbox().getLabel());
116     System.out.println("# Hobbies  ");
117     for(int i=0;i<hobbies.length;i++){
118       System.out.println(hobbies[i].getLabel()+" : "+(hobbies[i].getState()?"Yes":"No"));
119     }
120     System.out.println("# Description : "+description.getText());
121   }
122   public static void main(String[] args){
123     ComponentFormSample frame=new ComponentFormSample();
124     frame.setVisible(true);
125   }
126 }

Dosya Listesi

İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır