Root > Documents > Programlama > Java MultiFrames ve File Çalışması
Cyber-Warrior.Org \ Doküman \ Programlama > Java MultiFrames ve File Çalışması
Madde
  Yazar : army_man
  Date : 22.12.2011 14:05:50
 
# Java MultiFrames ve File Çalışması
 

Merhaba Arkadaslar,

Bu makelenin içerdigi konular;

ObjectInputStream, ObjectOutputStream, FileInputStream, FileOutputStream, ArrayList ve Serializable hakkindadir.

Programimiz çoklu pencerelerden olusan, text ve binary dosyalarini okuma ve yazma özelligine sahiptir.

Binary dosyasina ObjectOuputStream kullanarak yazma islemini gerçeklestiriyoruz. Burada da tüm arraylist’teki veriyi tek seferde yazma ve okuma islemi gerçeklestirsin istiyoruz. Bunun için implements Serializable metotlarindan yaralanacagiz.

Simdi koddumuzdan biraz bahsedelim.

Öncelikle engineers class’ini yazalim. Gayet basit bir class basinda implements Serializable var. Bu sayede ObjectOutputStream kullanarak dosyaya yazabiliyoruz. Sagladigi fayda, bu class’in bir stream halinde kullanilabilmelidir. Yani;

ObjectOutputStream objo= new ObjectOutputStream(new FileOutputStream("binary.bin"));
objo.writeObject(new engineers(....));
objo.close();

seklinde kullanabiliyoruz. Hazir gelen çogu class zaten Serializable, bu yüzden aslinda engineers classini Serializable yapmama gerek yoktu. Çünkü hep ArrayList kullandim ki o da Serializable.

Çoklu pencerelere deginelim.

Bunlari visual class seklinde olusturdum. Ilk olarak main(engMain) ve ikincil penceremizin(readTxtFrame) tasarimini yapip bitiriyoruz. Sonra main’in üst tarafina;
 
private readTxtFrame rtf1= new readTxtFrame(this);

ekliyoruz. Böylece ikinci frameden objeyi çagirabilecegiz. Ayrica bunun constructor’ina this gönderiyoruz. Yani main frame’in içinde ne varsa hersey. Bunun için ikinci frame’in constructor’ini düzenleyecegiz. Bundan sonra main de ilgili butonun click olayina;

rtf1.setVisible(true);
setVisible(false);

yaziyoruz. Ikinci pencereyi gösterip maini görünmez yaptik. Bu arada programin her yerinde bilgiler ArrayList’lerde tutuluyor. Main’de ArrayList’imizi yukarida tanimladik. Ikinci frame üzerinde yine;

engMain em = null;
ArrayList<engineers> a = new ArrayList<engineers>();

Tanimlarimizi yaptik. Main Frame’den bir obje olusturduk. Bunu mainin yukarisinda this seklinde gönderdigimiz engMain objesine esitleyecegiz ki main’de ki objeleri çagirabilelim(private olanlari degil). Sonra constructor’i tekrar düzenliyoruz.

public readTxtFrame(engMain f)
{ //mainden gelen this.
  super();
  initialize();
  em= f; //burada atamamizi yaptik.
}

read from file ve show in text area butonlarindaki kodlar neredeyse standart dosya açma ve yazdirma. Koddan inceleyebilirsiniz. Bu formda çoklu pencere kullanimi adina close butonu önemli.

Bu butonun click olayina asagidaki kod blogu yazili.

em.setArray(a);
em.setLabel("Data read and Array is filled and returned to main.");
em.setVisible(true);
dispose();

Simdi bunu biraz inceleyelim.

em.setArray(a); dedigim gibi ne kadar em adinda main’den bir obje olusturmus olsakta private nesnelerine dokunamayiz. public ve protected olanlara sartlar dahilinde istedigimizi yapariz. setArray fonksiyonunu main içinde yaziyoruz. Böylece elde ettigimiz bilgi main’e gidecektir.

public void setArray(ArrayList<engineers> a)
{
   arr=a; 
}

Bir de bilgilendirme amaçli yine ayni mantikla setLabel fonksiyonumuz var. main’i görünür yapiyoruz ve ikinci formu dispose() metodu ile ram’den kaldiriyoruz. Böylece en karmasik kisim bitmis oldu.

display all information butonu için dispAllInfo visual class’ini yazacagiz. Bu frame’e sadece arraylist’i gönderecegiz ve bize sadece çikti verecek. Butonun click olayina (main içinde);

dispInfoFrame dif = new dispInfoFrame(arr);   
dif.setVisible(true);
jLabel1.setText("display info button does not return anything to main...");

giriyoruz. Ilk satiri yukarida yazabilirdik ancak daha önce olusturulmadigindan null pointer exception’a düsüyor. Görünür yapiyoruz ve label’a bilgilendirici birseyler yaziyoruz.

dispInfoFrame’de ise sadece arraylist’den obje olusturup main’den geleni buna esitliyoruz ve içinde for döngüsüyle text area’ya çikti veren bir fonksiyon yazarak onu çagiriyoruz.

public dispInfoFrame(ArrayList<engineers> a)
{
   super();
   initialize();
   arr= a;
   showContent(a);
}

public void showContent(ArrayList<engineers> a)
{
   for (int i = 0; i < a.size(); i++)
   {
          jTextarea.append(a.get(i).toString()+ "\\n" );
   }
}

close butonunda da sadece dispose() var.

Build binary butonuda sadece dosyayi olusturmak için açip kapatiyoruz.

ObjectOutputStream objo = new ObjectOutputStream(new FileOutputStream("binary.bin"));

Sonrasinda, writeToBinaryFrame’i olusturuyoruz yine ilgili butonun click olayinda arraylist’i göndererekten çagiriyoruz.

write bin butonunda binary dosyaya yazma islemini yaptik.

try
{
    ObjectOutputStream objo= new ObjectOutputStream(new FileOutputStream("binary.bin"));
      
    objo.writeObject(arr);
    objo.close();
}
catch(Exception e2)
{
    JOptionPane.showMessageDialog(null, "something happened..." + e.toString());
}


objo.writeObject(arr); gördügünüz gibi herseyi tek seferde dosyaya aktardik.

read into text area butonunda da okumasi ve textarea’ya basma islemi var.

try
{
    ObjectInputStream inpo = new ObjectInputStream(new FileInputStream("binary.bin"));
    ArrayList<engineers> temp= (ArrayList<engineers>)( inpo.readObject());
       
     for(int i = 0; i < temp.size(); i++) 
    {
           jTextarea.append(temp.get(i).toString() + "\\n");
     }

    inpo.close();
}
catch(Exception e2)
{
      JOptionPane.showMessageDialog(null, "something happened..." + e.toString());
}

Tekrar binary dosyasini okudugumuzda arraylist’i tek seferde elde etmis olduk.

readBinWriteTextFrame class’imizda ise ilk butonda yukaridaki gibi binary dosyadan okuma islemi ve ayni try-catch içine aldigimiz bilgiyi text dosyasina yazma kodumuzu ekledik. Bunu da;

PrintWriter pw = new PrintWriter(new FileOutputStream("engineers2.txt"));

sayesinde yaptik. display butonunda tekrar text dosyadan okuma islemi var. Sadece satir satir okuyup text area’ya basiyoruz ve programimiz diger önemsiz noktalari hariç bitmis oluyor.

Programin kaynak koduna baglantidan erisebilirsiniz.

Iyi çalismalar...

 

   
   
Cyber-Warrior TIM All Legal and illegal Rights Reserved.\CWDoktoray 2001©