Bir bilgisayar mühendisi için programlama dili, öğrendiklerini sınadığı, deneyler yaptığı bir laboratuardır ve mühendisler deneylerini, kestiremedikleri sonuçları gözlemlemek için değil, öngördükleri sonuçları doğrulamak için yaparlar...
Öss dönemindeyken sürekli deneme sınavı yapar ve sınavdan çıkar çıkmaz puanımızı hesaplamaya koyulurduk. Onu çarp, bununla topla... uzun iş. Bu işi cep telefonlarına yaptırmamı sağlayacak bir programlama dili arayışına girdim. Java, Carbide C++, VB AppForge, Phyton gibi diller ile cep telefonlarına uygulama yazabileceğini öğrenip hemen denemelere başladım. İlk olarak Carbide.C++'ı ve sonra Javayı denedim. Ama o zamanlar C bilmediğim için pek bir şey anlayamadan bıraktım. Bana visual basicin mantığına daha yakın bir dil gerekiyordu; VB AppForge'u buldum. Ama üreticisi ona verdiği desteği geri çekince öylece kaldı o da. Sıra geldi Phyton'a. Phyton ile yazılmış programları inceleye inceleye Symbian 60 serisi üzerinde çalışabilen, deneme sınavı sonuçlarını hesaplamaya yarayan oldukça basit bir uygulama yazdım. Böyle basit bir uygulama için bile bu kadar uğraşmış olmam, mobil uygulama geliştirme hevesimi kaçırmıştı o zamanlar...
Bu dönem okulda java dilini de görmeye başladık. Javanın şimdilik işime yarayacağını düşündüğüm tek sürümü Java ME(Micro Edition). Taşınabilir mobil cihazlar için özelleştirilmiş bu sürümü ile Java destekli tüm cep telefonlarına, pdalara uygulama yazılabiliyor. Başlangıç olsun diye ders programını cep telefonunda kaydedip görebilmemi sağlayacak minik bir uygulama yazdım. Böylece Java ME'ye de bir merhaba demiş oldum.
Yukarıda ekran görüntüsü bulunan uygulamanın kodu:
package DP;
import java.util.Calendar;
import java.util.Date;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
/**
* Hüseyin Atasoy
* 02/04/2010
*/
// Canvas sınıfını miras al
class Tuvalim extends Canvas {
private String baslik, icerik;
private Font baslikf = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD, Font.SIZE_MEDIUM);
private Font yazif = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_PLAIN, Font.SIZE_SMALL);
private Midletim isteyen;
Tuvalim(Midletim _isteyen) {
isteyen = _isteyen;
}
public void paint(Graphics g) {
g.setColor(255, 255, 255);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(0, 0, 0);
g.setFont(baslikf);
g.setColor(0, 0, 255);
g.drawString(baslik, 10, 2, Graphics.TOP | Graphics.LEFT);
g.setColor(200, 0, 0);
g.drawLine(5, 18, getWidth() - 8, 18);
g.setFont(yazif);
g.setColor(0, 0, 0);
//Canvasta alt satıra geçişi olmadığı için alt satır geçişlerini bizim düzenlememiz lazım
icerik = " " + icerik;
String satir = "";
int yukaridan = 23;
//int i = 1;
int konum = 0, oncekiKonum;
while (true) {
oncekiKonum = konum + 1;
konum = icerik.indexOf('\n', konum + 1);
try {
satir = icerik.substring(oncekiKonum, konum);
} catch (Exception ex) {
satir = icerik.substring(oncekiKonum, icerik.length());
break;
} finally {
satir = satir.trim();
if (satir.length() > 0) {
g.drawString(satir, 10, yukaridan, Graphics.TOP | Graphics.LEFT);
//Yanlarda 1), 2)... görünmesini istiyorsan alttakini aktifleştir.
//g.drawString((i++) + ") " + satir, 10, yukaridan, Graphics.TOP | Graphics.LEFT);
}
yukaridan = yukaridan + 15;
}
}
}
void yaz(String _baslik, String _icerik) {
baslik = _baslik;
icerik = _icerik;
}
protected void keyPressed(int keycode) {
switch (keycode) {
case Canvas.KEY_NUM0:
isteyen.goster(isteyen.gunIsmi);
break;
case Canvas.KEY_NUM1:
isteyen.goster("Pazartesi");
break;
case Canvas.KEY_NUM2:
isteyen.goster("Salı");
break;
case Canvas.KEY_NUM3:
isteyen.goster("Çarşamba");
break;
case Canvas.KEY_NUM4:
isteyen.goster("Perşembe");
break;
case Canvas.KEY_NUM5:
isteyen.goster("Cuma");
break;
case Canvas.KEY_NUM6:
isteyen.goster("Cumartesi");
break;
case Canvas.KEY_STAR:
isteyen.duzenle();
break;
case Canvas.KEY_POUND:
isteyen.hakkinda();
break;
}
}
}
//MIDlet sınıfını miras al ve CommandListener interface'ini tamamla...
public class Midletim extends MIDlet implements CommandListener {
private int gun = 0;
public String gunIsmi = "";
private String simdiki = "";
kayitci kayitlar;
private Tuvalim T1;
private Command bugun = new Command("Bugün", Command.ITEM, 0);
private Command pazartesi = new Command("Pazartesi", Command.ITEM, 0);
private Command sali = new Command("Salı", Command.ITEM, 0);
private Command carsamba = new Command("Çarşamba", Command.ITEM, 0);
private Command persembe = new Command("Perşembe", Command.ITEM, 0);
private Command cuma = new Command("Cuma", Command.ITEM, 0);
private Command cumartesi = new Command("Cumartesi", Command.ITEM, 0);
private Command duzenle = new Command("Düzenle", Command.ITEM, 0);
private Command hakkinda = new Command("Hakkında", Command.ITEM, 0);
private Command cikis = new Command("Çıkış", Command.EXIT, 0);
private Command iptal = new Command("İptal", "İptal", Command.EXIT, 0);
private Command kaydet = new Command("Kaydet", "Kaydet", Command.ITEM, 0);
private TextBox textBox = new TextBox(" ", null, 400, TextField.ANY);
//MIDlet sınıfına ait startApp() fonksiyonunun implementasyonu
public void startApp() {
gunNum();
hangiGun();
try {
kayitlar = new kayitci("DersProgrami");
} catch (Exception ex) {
}
goster(gunIsmi);
textBox.addCommand(kaydet);
textBox.addCommand(iptal);
textBox.setCommandListener(this);
}
//MIDlet sınıfına ait destroyApp() fonksiyonunun implementasyonu
protected void destroyApp(boolean unconditional) {
Display.getDisplay(this).setCurrent(null);
notifyDestroyed();
}
//MIDlet sınıfına ait pauseApp() fonksiyonunun implementasyonu
protected void pauseApp() {
}
//CommandListener interface'ine ait commandAction() fonksiyonunun implementasyonu
public void commandAction(Command command, Displayable displayable) {
if (displayable == textBox) {
if (command == iptal) {
Display.getDisplay(this).setCurrent(Tuval());
} else if (command == kaydet) {
kaydet(simdiki, textBox.getString());
goster(simdiki);
}
} else {
if (command == bugun) {
goster(gunIsmi);
} else if (command == pazartesi) {
goster(pazartesi.getLabel());
} else if (command == sali) {
goster(sali.getLabel());
} else if (command == carsamba) {
goster(carsamba.getLabel());
} else if (command == persembe) {
goster(persembe.getLabel());
} else if (command == cuma) {
goster(cuma.getLabel());
} else if (command == cumartesi) {
goster(cumartesi.getLabel());
} else if (command == duzenle) {
duzenle();
} else if (command == hakkinda) {
hakkinda();
} else if (command == cikis) {
destroyApp(true);
}
}
}
public void gunNum() {
Calendar a = Calendar.getInstance();
a.setTime(new Date());
gun = a.get(a.DAY_OF_WEEK);
Display.getDisplay(this).setCurrent(Tuval());
}
public void hakkinda() {
Alert alert = new Alert("Hakkında");
alert.setString("Hüseyin Atasoy, 02/04/2010");
alert.setType(AlertType.INFO);
alert.setTimeout(Alert.FOREVER);
Display.getDisplay(this).setCurrent(alert, Tuval());
}
public void duzenle() {
textBox.setTitle(simdiki);
textBox.setString(kayitlar.kayitOku(simdiki));
Display.getDisplay(this).setCurrent(textBox);
}
public void hangiGun() {
switch (gun) {
case 1: //Pazar günü tatil o gün ders mi olur, Pazartesi gününü göster...
gunIsmi = "Pazartesi"; break;
case 2:
gunIsmi = "Pazartesi"; break;
case 3:
gunIsmi = "Salı"; break;
case 4:
gunIsmi = "Çarşamba"; break;
case 5:
gunIsmi = "Perşembe"; break;
case 6:
gunIsmi = "Cuma"; break;
case 7:
gunIsmi = "Cumartesi"; break;
}
}
public Tuvalim Tuval() {
if (T1 == null) {
T1 = new Tuvalim(this);
T1.addCommand(bugun);
T1.addCommand(pazartesi);
T1.addCommand(sali);
T1.addCommand(carsamba);
T1.addCommand(persembe);
T1.addCommand(cuma);
T1.addCommand(cumartesi);
T1.addCommand(duzenle);
T1.addCommand(hakkinda);
T1.addCommand(cikis);
T1.setCommandListener(this);
}
return T1;
}
public void goster(String hangiGunu) {
simdiki = hangiGunu;
String kayit = "";
kayit = kayitlar.kayitOku(simdiki);
if (kayit == null) {
kayit = " -- Ayarlanmamış --";
}
try {
Tuval().yaz(hangiGunu, kayit);
Tuval().repaint();
} catch (Exception ex) {
Alert alert = new Alert("Kayıt Yok");
alert.setString("Bu güne ait bir kayıt bulunmuyor!");
alert.setType(AlertType.WARNING);
alert.setTimeout(Alert.FOREVER);
Display.getDisplay(this).setCurrent(alert, textBox);
}
Display.getDisplay(this).setCurrent(Tuval());
}
public void kaydet(String hangiGun, String dProg) {
try {
kayitlar.ekle(hangiGun, dProg);
kayitlar.kaydet();
} catch (Exception ex) {
}
}
}
RMS veritabanı okuma/yazma sınıfı:
package DP;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.*;
import javax.microedition.rms.*;
/**
* RecordStore Okuma Yazma Sınıfı
* Hüseyin Atasoy
* 02/04/2010
*/
public class kayitci {
private String vtIsmi;
private Hashtable hashTablom;
public kayitci(String _vtIsmi) throws RecordStoreException, IOException {
vtIsmi = _vtIsmi;
hashTablom = new Hashtable();
yukle();
}
public String kayitOku(String anahtar) {
return (String) hashTablom.get(anahtar);
}
public void ekle(String anahtar, String deger) {
if (deger == null) {
deger = "";
}
hashTablom.put(anahtar, deger);
}
private void yukle() throws RecordStoreException, IOException {
RecordStore rs = null;
RecordEnumeration re = null;
try {
rs = RecordStore.openRecordStore(vtIsmi, true);
re = rs.enumerateRecords(null, null, false);
while (re.hasNextElement()) {
byte[] baytDizi = re.nextRecord();
ByteArrayInputStream bin = new ByteArrayInputStream(baytDizi);
DataInputStream din = new DataInputStream(bin);
String kayit = new String(din.readUTF());
//ismi ayıkla
int index = kayit.indexOf('|');
String isim = kayit.substring(0, index);
String deger = kayit.substring(index + 1);
ekle(isim, deger);
}
} finally {
if (re != null) {
re.destroy();
}
if (rs != null) {
rs.closeRecordStore();
}
}
}
public void kaydet() throws RecordStoreException, IOException {
RecordStore rs = null;
RecordEnumeration re = null;
try {
rs = RecordStore.openRecordStore(vtIsmi, true);
re = rs.enumerateRecords(null, null, false);
// Tüm kayıtları sil
while (re.hasNextElement()) {
int id = re.nextRecordId();
rs.deleteRecord(id);
}
// Sonra da kayıtları yerleştir
Enumeration anahtarlar = hashTablom.keys();
while (anahtarlar.hasMoreElements()) {
String anahtar = (String) anahtarlar.nextElement();
String deger = kayitOku(anahtar);
String kayit = anahtar + "|" + deger;
//maksat utf kodlamasıyla yazılsın, yoksa Türkçe karakterler görünmüyor
ByteArrayOutputStream bout = new ByteArrayOutputStream();
DataOutputStream dout = new DataOutputStream(bout);
dout.writeUTF(kayit);
byte[] baytDizi = bout.toByteArray();
rs.addRecord(baytDizi, 0, baytDizi.length);
}
} finally {
if (re != null) {
re.destroy();
}
if (rs != null) {
rs.closeRecordStore();
}
}
}
}
Yayınlanma Tarihi: 04 Nisan 2010 Pazar - 22:06
Anahtar Kelimeler: java me, micro edition, java, cep telefonları, uygulama geliştirmek, yazmak, nokia, symbian, series60
Yorumlar ( 2 )
mehmet#1
20/08/2010, 17:45
javanın en kötü yanı. küçük bir harf hatasını bile kabul etmemesi. program yazarken sıkıntı oluşturuyor.. Özellikle büyük küçük harf olayında...
Hüseyin Atasoy#2
20/08/2010, 17:53
Evet katılıyorum. Ctrl+Space sağolsun :)
Yorum/Görüş Bildir