Swing’in JTable nesnesi ve TableModel kullanımına ilişikin bir yazı

Swing’de JTable nesnesi MVC (Model-View-Controller / Model – Görünüş – Denetleyici) desenine uygun olarak tablonun verisi ile görsel bileşeni ayrı tanımlamaya izin verir.  JTable, model olmadan da, bir matris (iki boyutlu dizi) verilerek de kullanılabilir. Örneğin

  String[] columns=new String[]
{“Ad”,”Soyad”,”Ev Tel”,”Cep Tel”,”E-Mail”}; 

String[][] cells=new String[][]{
{“Ali”,”Yılmaz”,”622 12 56″,”533 7234 45 67″,”axxx@yahoo.com”},
{“Veli”,”Kaya”,”642 01 14″,”543 257 42 657″,”byyy@hotmail.com”},
{“Ahmet”,”Gül”,”621 52 12″,”533 234 25 27″,”zzz@mynet.com”}};
JTable table=new JTable(cells,columns);

şeklinde bir kod parçası bir matristen tablo oluşturabilir.

Bazı durumlarda tablo verisi program çalışmadan önce belli değildir veya çalışma esnasında sürekli değişiyordur. Bu durumda TableModel arayüzünü gerçekleştirerek verinin gerçek zamanda JTable nesnesine verilmesi sağlanabilir. TableModel programcının gerçekleştirebileceği bir arayüzdür. Ancak onu genişleten, sadece 3 yöntemi yazarak modelin gerçekleştirilebilmesini sağlayan AbstractTableModel sınıfı bulunmaktadır. Bunun üç yöntemi, satır sayısını veren bir yöntem, sütün sayısını veren bir yöntem ve satır ve sütunu verilen bir hücrenin değerini veren bir yöntem. Yöntemler

  public int getColumnCount();
public int getRowCount();
public Object getValueAt(int rowIndex, int columnIndex);

şeklinde tanımlı. Elbette bu yöntemler dışında AbstractTableModel‘de tanımlı bazı yöntemler ezilebilir.

Burada tablo modeli, bir klasör içerisindeki dosya ve alt klasörleri göstersin. Bunun için tablo modeli gereçekleştiren sınıfta klasöre ait bir değişken olması yeterlidir. Örnekte üç sütun bulunmaktadır. Dosya adı, boyuru ve yaratılma tarihi. Bu bilgileri verecek şekilde tablo modelini gerçekleştirmek için

  private File directory;

  public TableModelTest(File directory){
this.directory=directory;
}

  public int getColumnCount(){
return 3;
}
public int getRowCount(){
File[] files=directory.listFiles();
return files.length;
}

public Object getValueAt(int rowIndex, int columnIndex){
File[] files=directory.listFiles();
File file=files[rowIndex];
if(columnIndex==0){
return file.getName();
}else if(columnIndex==1){
if(file.isFile()){
return file.length()+” bayt”;
}else{
return “”;
}
}else if(columnIndex==2){
DateFormat format=DateFormat.getDateInstance(DateFormat.SHORT);
Date date=new Date(file.lastModified());
return format.format(date);
}
return “”;
}       

şeklinde bir kod sınıfın içine yazlılabilir. Bu sınıfta File tipindeki nesneyi kullanarak yöntemler gerçekleştirilebilir. Sütün sayısı sabitir : 3. Satır sayısı bir klasörün altındaki dosyaların sayısıdır. Bir hücrenin değeri o satırdaki dosyanın çeşitli bilgilerinden gelir. İlk sütundaki adı, ikinci sütunda boyutu ve son sütundada oluşturulma tarihi bulunur. Oluşturma tarihi lastModifed() yöntemiyle milisaniye cinsinden bulunduğu için belli bir tarih biçiminde dönüşütürülüyor.

Gerçekleştirilmesi zorunlu üç yöntem dışında sütun alanlarının belirleyen getColumnName() yöntemi de gerçekleştirilebilir.

  private String[] culumnNames=
{“Dosya Adı”,”Boyut”,”Son Değiştirilme Tarihi”};

  public String getColumnName(int column){
return culumnNames[column];
}

Burada sütun adları dizisi tanımlanmakta yöntemde sütun dizinine göre bir değer döndürülmektedir.

Örneğin tamamı :

import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;
import java.awt.*;
import java.io.*;
import java.util.*;
import java.text.*;

public class TableModelTest extends AbstractTableModel{

private File directory;
private String[] culumnNames=
{“Dosya Adı”,”Boyut”,”Son Değiştirilme Tarihi”};

  public TableModelTest(File directory){
this.directory=directory;
}

  public int getColumnCount(){
return 3;
}
public int getRowCount(){
File[] files=directory.listFiles();
return files.length;
}
public String getColumnName(int column){
return culumnNames[column];
}
public Object getValueAt(int rowIndex, int columnIndex){
File[] files=directory.listFiles();
File file=files[rowIndex];
if(columnIndex==0){
return file.getName();
}else if(columnIndex==1){
if(file.isFile()){
return file.length()+” bayt”;
}else{
return “”;
}
}else if(columnIndex==2){
DateFormat format=DateFormat.getDateInstance(DateFormat.SHORT);
Date date=new Date(file.lastModified());
return format.format(date);
}
return “”;
}  

  public static void main(String[] args){
JFrame frame=new JFrame();
frame.setBounds(100,100,400,300);
File directory=new File(“C:”);
TableModelTest model=new TableModelTest(directory);
JTable table=new JTable(model);
frame.getContentPane().add(new JScrollPane(table));
frame.setVisible(true);
}

}

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir