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