ana sayfa : araştırma : java uygulamaları : basit animasyon ve bağlantılar [ 9 / 12 ]

GERİ

9 BASİT ANİMASYONLAR VE BAĞLANTILAR

 

Java basit animasyonlar için sınırlı sayıda metod içerir.

 

9.1 Boyama ve Tekrar Boyama

 

Paint() metodu applet boyama gerekli oldukça kullanılır. Appletin ilk oluşturulmasında, appleti içeren pencerenin hareket ettirilmesinde veya başka bir pencerenin appletinin bulunduğu pencereye hareketinde bu metod kullanılır. Aynı zamanda kullanıcı gerekli gördükçe de bu metodu kullanabilir.

 

Ekran çıktısını değiştirmek için boyanmak istenen imaj oluşturulduktan sonra Java kullanılarak boyama yapılır. Eğer bu işlem yeterince hızlı tekrar edilirse animasyon elde edilir. Bütün bunlar paint() metodunun içinde olmaz. Paint() metodu sadece o anki çerçeveyi boyar. Paint() metodunun yaptığı değiştirmek ise appletin içinde başka bir yerde olur.

 

Başka yer dediğimiz bu ortamda çerçeve tasarlanır ve repaint() çağrılır. Repaint() Java’nın paint() metodunun çağrılması aktive eder. Java appletleri içinde boyanması gereken çok sayıda bileşen bulunabileceği için appletler daha büyük Java appletleri içinde bulunurlar. Repaint() ve paint() arasındaki fark paint() metodu boyarken repaint() Java’ya boyama isteğini bildirir. Bu nedenle çok sayıda repaint() peşpeşe sıralandığında sistem hepsi için tek bir değerlendirme yapabilir veya gecikme olabilir. (Tanyeri,1997)

 

9.2 Appletin Çalıştırılması ve Durdurulması

 

Gerçek anlamda işlem yapan appletlerin çalıştırılması ve durdurulması için start() ve stop() kullanılmalıdır. Stop() appletin bulunduğu sayfa terk edilirken kullanılır.

 

Start() metodu appletin çalıştırılmasını aktive eder. Bu metod kullanılırken iki değişik yol izlenebilir. İlkinde appletin tümaktiviteleri bu metod içinde gerçekleştirilir. Diğer bir yol da aynı işi yapmak için başka metodların çağrılmasıdır. Start genel olarak applet bağlantısının başlangıç ve aktivasyon mekanizmalarını oluşturmada kullanılır.

 

Stop() ise appletin çalışmasını durdurmada kullanılır. Appletin bulunduğu sayfadan çıkıldığı anda appletin çalışması durdurulur ve appletin kullandığı sistem kaynakları da serbest bırakılır. Çoğu kez start() oluşturulduğunda ilgili stop() metodu da oluşturulmalıdır.(Grup Java,2000)

 

9.3 Bağlantı Oluşturma

 

Java’da animasyonun nasıl yapıldığı örnekler yardımıyla açıklanacaktır. Aşağıdaki program parçası tarih ve zamanı göstermesi istenen bir applet için hazırlanmıştır. Her saniye tıpkı dijital saatte olduğu gibi saniye saniye değişmektedir. Fakat applet çelıştırılmak istendiğinde çalışmayacaktır.

 

·         import java.awt.graphics;

·         import java.awt.font;

·         import java.util.date;

·         import java.applet.*;

·         public class saat extends applet{

·         font f1=new font(“times new roman”,font.bold,24);

·         date tarih;

·         public void start() {

·         while (true) {

·         tarih = new date();

·         repaint();

·         try { thread.sleep(1000); }

·         catch

·         }

·         }

·         public void paint(graphics g) }

·         g.setfont(f1);

·         g.drawString(tarih.toString(),10,50);

·         }

·         }

 

ve 7. satırlardaki temel sınıf değişkeni tanımlanır. Font ve date değişkenleri o anki fontu ve tarihi belirtmek için kullanılırlar. Start() metodu appletin başlatılmasını sağlar. Bu metod içindeki while döngüsüne dikkat edilmelidir. Test sonucu devamlı true olduğundan döngüden hiçbir zaman çıkmaz. Basit bir animasyon çerçevesi while döngüsü içinde aşağıdaki adımlar kullanılarak gerçekleştirilir. (Grup Java,2000)

 

Date sınıfı tarih ve zamanı gösterir. Datye sınıfı java.util paketinin bir parçasıdır. Üçüncü satırda java.util paketinden import komutu ile date sınıfı programa dahil edilir. 10. satırda date sınıfına ait bir örnek oluşturulur. Repaint() metodunu çağrılır. (Grup Java,2000)

 

12. ve 13. satırlar bin milisaniyelik bir ara verilmesini sağlarlar. Daha sonra döngü kendini tekrar eder. Thread sınıfına ait sleep() metodu burada appletin geçici bir süre durmasına ait sleep() metodu burada appletin geçici bir süre durmasında kilit rol oynar. Sleep() kullanılmadığında applet çoğu kez gözün ayırt edemeyeceği kadatr hızlı çalışır. Sleep() appletin çalışma hızının kontrolünde kullanılır. (Grup Java,2000)

 

Paint() metodu mesajın akrana basılmasını sağlar. Fakat burada date tipindeki değişkeni string tipine könüştürmek için toString() metodu kullanılmalıdır. Paint() yeni zamanı basmak için her saniye çağrıldığından toString() metodu da her saniye güncelleme için çağrılmalıdır. (Grup Java,2000)

 

Paint() içinde date() nesnesi oluşturmak ilk bakışta kolay gibi görünse de bu durumda oluşturulacak değişken local türde bir değişken olur. Bu şekilde date() sınıfına ait örnek değişken oluşturmak gereksiz hale gelse de oluşturulan yeni program daha az etkkindir. Paint() animasyonun her değişmesinde çağrılmalıdır. Burada ki örneğimizde fazla fark etmemekle beraber bu durumda paint() her sefer yeniden sınıf örneği oluşturmak zorunda kalacak ve animasyon hızı da düşecektir.

 

9.4 Bağlantılar

 

Program çalıştırıldığında öncelikle değişkenlerine ilk değer ataması yapar, metod çağırır ve bitinceye veya kullanıcı programdan çıkıncaya kadar çalışır. Böyle bir program tek bir bağlantı kullanır. Bu da programın kontrolüdür.

 

Çok bağlantılılık değişik çalışma bağlantılarının aynı anda aynı program içinde birbirine karışmadan çalışmasını mümkün kılar.

 

Java’da bağlantılar kullanılarak oluşturulan appletler kendi bağlantılarında çalışabilirler. Böylelikle aynı web sayfası içinde çok sayıda applet bulunması ve bunların birbirinden bağımsız çalışması mümkündür. Fakat böyle bir durumda sistem hızına bağlı olarak animasyon hızı da düşer.

 

9.5 Bağlantı Kullanılarak Applet Yazımı

 

Kullanılacak kodun çoğu bütün appletlerde aynı olduğundan birisi için kullanılan kodu diğer appletlere de taşıyabiliriz. Bağlantı kullanmak için appletler de dört temel değişiklik yapmak gerekir.

 

  • Applet tanımına implements runnable eklenir.
  • Appletin bu bağlantıyı alması için örnek değişken tanımlanır.
  • Start() metodunu değiştirip bağlantıyı aktive etmesi ve çalıştırması sağlanır.
  • Applet kodunu içeren bir run metodu oluşturulur.

 

İlk değişiklik sınıf tanımlamasında yapılır.

Public class appletin extends java.applet.applet{

.....

}

 

Public class appletin extends java.applet.applet implements runnable{

....

}

 

şeklinde değişiklik yapılmalıdır. Yapılan bu değişiklik sayesinde Runnable ara yüzü applete dahil edilir. Burada Runnable ara yüzü appletin davranışını tanımlar. Özellikle run() metodunun tanımı yapılır.

 

İkinci adımda ise appletin bağlantısı için örnek değişken eklemektir. Değişkenin tipi thread dir.

 

Üçüncü adım ise start() metodu eklenir veya mevcut start() değiştirilir ve çalıştırılır. Aşağıdaki örnek bununla ilgilidir.

 

Public void start() {

İf (bisiklet = = null); {

Bisiklet = newthread(this);

Bisiklet.start();

} }

start() değiştirildiğinde appletin gövdesinin nereye gittiğini inceleyelim. Gövde yeni oluşturulan Run() metodunun içine gider.

 

Public void Run() {

/ appletin yapması istenen

}

 

run() farklı bağlantılarda çalışması istenen her şeyi içerebilir. Run() içinde yeni nesneler oluşturulabilir ve metodlar çağrılabilir. Böylelikle çalıştırılabilecek bağlantılar ve bunları aktive edebilecek start() metodları vardır. Fakat appletin durdurulması için stop() metodu eklenmelidir.

Stop() metodu için şu kodlar kullanılabilir. (Grup Java,2000)

 

Public void stop() {

İf (bisiklet !=null) {

Bisiklet.stop();

Bisiklet=null;

}

}

burada stop metodu iki iş birden yapar. Birincisi bağlantıyı çalıştırmayı durdurur. Ve bağlantı değişkeni runner’e null değeri atar.

 

saat.java

 

import java.util.*;

import java.awt.*;

import java.applet.*;

Example of calling convention:

The default 24 hr format:

<applet code="Dgclock.class" width=100 height=30></applet>

To display time in 12 hr format:

<applet code="Dgclock.class" width=100 height=30>

<param name="TimeFormat" value="%I">

</applet>

To display NewYork time:

<applet code="Dgclock.class" width=100 height=30>

<param name="TZ" value="GMT-0500">

</applet>

12 or 24 hr format

<param name="TimeFormat" value="%H">    (24 hr format - default)

<param name="TimeFormat" value="%I">    (12 hr format)

the format for value is GMT+-hhmm, for example

<param name="TZ" value="GMT+0600">    (6 hours west of Greenwich meridian)

<param name="TZ" value="GMT+0430">    (4 hours, 30 minutes

                                      west of Greenwich meridian)

<param name="TZ" value="GMT+0000">    (Greenwich)

<param name="TZ" value="GMT-0500">    (5 hours east of Greenwich meridian)

<param name="ShowDate" value="yes">   (show date with time)

<param name="ShowDate" value="no">   (don't show date - default)

*/

public class Dgclock extends Applet implements Runnable

{    Thread        timer=null;

Image[]        simage=new Image[10],        image=new Image[11];

Image        frame_image,        buf_image;

    Graphics    gc;

    int        bdigit_width=15;

    int        sdigit_width=7;

    int        base_width=100;

    int        base_height=30;

    int      offset=4;

    String TimeFormat="%H";

    long     TimeDiff=0L;

    boolean        ShowDate=false;

    int checkTZ(String TZ)

    {       int    d;

       int  hr, min; int               counter=0;       int diff=0;

            hr=0;  min=0;       if (TZ != null)

       {

            int length=TZ.length();            if (length == 8)

            {

                int c=TZ.charAt(3);                if ((c == '-') || (c == '+'))

                {

                    String tzval=TZ.substring(4,8);

                    //Print("TZ value= " + tzval);

            

                    for (int i=0; i < tzval.length(); i++)

                    {

                        d=tzval.charAt(  if ( (d >= '0') && d <= '9')

                        {

                            if (counter < 2)                                  hr=hr*10+(d-'0');

                            else                                  min=min*10+(d-'0');

                            counter++;

                        }}

                                        diff=(hr*60)+min; if (c == '-')

                        diff=(-diff);

                }}       }       return diff;    } 

 

    public void init()

    { int      x, y;

        if (getParameter("TimeFormat") != null)

        {            TimeFormat=getParameter("TimeFormat");

        }if  ((!TimeFormat.equals("%I")) && (!TimeFormat.equals("%H")))

            TimeFormat="%H"; if (getParameter("ShowDate") != null)

        {

            String showd=getParameter("ShowDate");            if (showd.equals("yes")                ShowDate=true }

                    frame_image=getImage(getCodeBase(),"jimages/frame.gif");

 

        for (int i=0; i <= 10; i++)

      {      image[i]=getImage(getCodeBase(),"jimages/h" + i + ".gif");}

        for (int i=0; i <= 9; i++)

        {            simage[i]=getImage(getCodeBase(),"jimages/s" + i + ".gif");}

        int            diff=0;        String timezone=getParameter("TZ");if (timezone != null)

        {            if (timezone.equals("LOCAL");      TimeDiff=0L;            else

            {                Date date=new Date();  diff=checkTZ(timezone);

                TimeDiff=((long) date.getTimezoneOffset())*60000+diff*60000;}        }

        try

        {            buf_image=createImage(base_width,base_height);

            gc=buf_image.getGraphics();

        } catch (Exception e) gc=null;    }     public void start()

    {       if (timer == null)

        {      timer=new Thread(this, "Dgclock");  timer.start();        }    }

    public void run()

    {        while (timer != null)  {            try

            {               timer.sleep(1000);            }catch (InterruptedException e)  { }

            repaint();        }        timer=null;}

        public void paintApplet(Graphics g)

    {    int      i,j,            k;

        Date            now=new Date();

        int   hour,minute, second;

        String    hr,  min, sec,  today;

        if (TimeDiff != 0L)

        {            now.setTime(now.getTime()+TimeDiff);        }

        hr=formatDate(TimeFormat,now);

        min=formatDate("%M",now);        sec=formatDate("%S",now);

        if (ShowDate == true)  { today=formatDate("%d",now);        }

        else    today="";        g.drawImage(frame_image,0,0,this);

                for (i=0; i <hr.length(); i++){g.drawImage(image[hr.charAt(i)-'0'],(i*bdigit_width)+                offset,offset,this);

        }        g.drawImage(image[10],(i*bdigit_width)+offset,offset,this);

        i++;   for (j=0; j < min.length(); j++)

        {  g.drawImage(image[min.charAt(j)-'0'],(i*bdigit_width)+

                offset,offset,this);  i++;}  for (j=0; j < sec.length(); j++)

        { g.drawImage(simage[sec.charAt(j)-'0'],(i*bdigit_width)+

                (j*sdigit_width)+offset,offset,this); }

        if (ShowDate == true)   {    for(k=0; k < today.length(); k++)

            {  g.drawImage(simage[today.charAt(k)-'0'],

                    (i*bdigit_width)+(k*sdigit_width)+offset,14,this);} }  }

    public void update(Graphics g){if (buf_image != null){paintApplet(gc);

            g.drawImage(buf_image,0,0,this);

        } else {  g.clearRect(0,0,base_width,base_height);  paintApplet(g);  }    }

private String padElement(int expr, char padChar) {  String result = "";

  if (expr < 10) result = result.concat(String.valueOf(padChar));

  result = result.concat(String.valueOf(expr));

  return(result); 

} private String formatDate(String fmt, Date d)

{ String formattedDate = "";

  int hour = d.getHours(); int minute = d.getMinutes();

  int second = d.getSeconds();  int monthDay = d.getDate();  int US_Hour = hour < 13 ? hour : hour - 12;

        for(int i = 0; i < fmt.length(); i++)

  {if (fmt.charAt(i) == '%'){      i++;      switch (fmt.charAt(i))

{ case 'H':        formattedDate = formattedDate.concat(padElement(hour, '0')); break;

   case 'I':        formattedDate = formattedDate.concat(padElement(US_Hour, '0')); break;      case 'M':        formattedDate = formattedDate.concat(padElement(minute, '0')); break; case 'd':        formattedDate = formattedDate.concat(padElement(monthDay, '0')); break;      case 'S':        formattedDate = formattedDate.concat(padElement(second, '0')); break;    default:        formattedDate = formattedDate.concat("??"); break;

      }    }    else     {

      formattedDate = formattedDate.concat(String.valueOf(fmt.charAt(i)));

    }  }  return(formattedDate); }    public void stop()  { timer.stop();  timer=null;    }

      public void Print(String str)  {   System.out.println(str);  }}

Şekil 9.1 Saat.html

saat.html

 

<html>

<head>

<title>Dgclock in Java</title>

</head>

<body bgcolor="#ffffff" link="#ff0000" vlink="#0000ff" alink="#00ff00">

Dgclock in Java (beta applet) Version 2.0

 

<p> <center> <table> <tr> <td> <td> <b>Your time:</b> </td> <td>

<applet code="Dgclock.class" width=100 height=30>

</applet> </td> </tr> </table> </center> <center> <table> <tr> <td> <b>Dhaka:</b>

</td> <td> <applet code="Dgclock.class" width=100 height=30> <param name="TZ" value="GMT+0600"> <param name="ShowDate" value="yes"> </applet>  </td> <td>

</td> <td> <b>NewYork:</b> </td> <td>

<applet code="Dgclock.class" width=100 height=30> <param name="TZ" value="GMT-0500"> </applet> </td> <td> <b>London:</b> </td> <td>

<applet code="Dgclock.class" width=100 height=30> <param name="TZ" value="GMT+0000"> <param name="ShowDate" value="yes"> </applet> </td> </tr>

</table> </center>

<a href="http://www.semcor.com/~muquit/"><B>[Homepage] of "Clockmaker"</B></a>

</body> </html>

 Yukarıdaki program görüldüğü gibi djital bir saatin kullanımıyla ilgilidir.