İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır
Zafer Teker
tekzaf@yahoo.com

Directory(Klasör) İçindeki Dosya ve Klasörleri Gösteren Bir Component

Bu komponent bir klasörün içindeki klasörleri ve dosyaları göstermektedir. Bir klasör çift tıklanırsa o klasörün içi gösteriliyor. Yukarı düğmesi tıklandığında bir üst klasöre geçilmiş oluyor.

Klasörün içeriği bir tablo'da gösteriliyor. Bunun için JTable extends edilerek DirectoryTable nesnesi yaratılmıştır. Bu tablo DirectoryViewer panel'ine koyulmuştur. DirectoryTable model olarak DirectoryTableModel'i kullanır.

DirectoryTableModel

Göster Gizle Kopar Satır Gizle Satır Göster
  1 package com.godoro.test;
  2 import javax.swing.table.*;
  3 import java.io.*;
  4 import java.util.*;
  5 import java.text.*;
  6 import java.util.*;
  7 public class DirectoryTableModel extends AbstractTableModel{
  8   private String[] theColumnNames=new String[]{"Ad","Boyut","Değiştirilme"};
  9   private File theDirectory;
 10   private ArrayList theFileList;
 11   public DirectoryTableModel(File directory){
 12     setDirectory(directory);
 13   }
 14   public void setDirectory(File directory){
 15     theDirectory=directory;
 16     updateList();
 17     fireTableDataChanged();
 18   }
 19   public File getFile(int row){
 20     return (File)theFileList.get(row);
 21   }
 22   public int getRowCount(){
 23     return theFileList.size();
 24   }
 25   public int getColumnCount(){
 26     return 3;
 27   }
 28   public Object getValueAt(int row, int column){
 29     File file=(File)theFileList.get(row);
 30     if(column==0){
 31       return file;
 32     }else if(column==1&&!file.isDirectory()){
 33       long length=file.length();
 34       String size="";
 35       if(length>1024){
 36         size=length/1024+" kb";
 37       }else{
 38         size=length+" b";
 39       }
 40       return size;
 41     }else if(column==2&&!file.isDirectory()){
 42       return getFormattedDate(file.lastModified());
 43     }else{
 44       return "";
 45     }
 46   }
 47   public String getColumnName(int column){
 48     return theColumnNames[column];
 49   }
 50   private void updateList(){
 51     theFileList=new ArrayList();
 52     File[] theDirectoryList=theDirectory.listFiles(new FileFilter(){
 53       public boolean accept(File f){
 54         return f.isDirectory();
 55       }
 56     });
 57     File[] theNormalFileList=theDirectory.listFiles(new FileFilter(){
 58       public boolean accept(File f){
 59         return !f.isDirectory();
 60       }
 61     });
 62     for(int i=0;i<theDirectoryList.length;i++){
 63       theFileList.add(theDirectoryList[i]);
 64     }
 65     for(int i=0;i<theNormalFileList.length;i++){
 66       theFileList.add(theNormalFileList[i]);
 67     }
 68   }
 69   private static String getFormattedDate(long longDate){
 70     java.util.Date date=new Date(longDate);
 71     String dateOut;
 72     DateFormat dateFormatter;
 73     Locale currentLocale= new Locale("tr","TR");
 74     dateFormatter = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.LONG,currentLocale);
 75     dateOut = dateFormatter.format(date);
 76     String dateStr= dateOut.substring(6, 10)+"-";
 77     dateStr= dateStr+dateOut.substring(3, 5)+"-";
 78     dateStr= dateStr+dateOut.substring(0, 2)+" ";
 79     dateStr= dateStr+dateOut.substring(11, 19);
 80     return dateStr;
 81   }
 82 }

DirectoryTableModel AbstractTableModel class'ını extend eder. Abstract olan üç methodunu

  public int getRowCount(){
    return theFileList.size();
  }
  public int getColumnCount(){
    return 3;
  }
  public Object getValueAt(int row, int column){
    File file=(File)theFileList.get(row);
    if(column==0){
      return file;
    }else if(column==1&&!file.isDirectory()){
      long length=file.length();
      String size="";
      if(length>1024){
        size=length/1024+" kb";
      }else{
        size=length+" b";
      }
      return size;
    }else if(column==2&&!file.isDirectory()){
      return getFormattedDate(file.lastModified());
    }else{
      return "";
    }
  }

şeklinde doldurur. Model kurucuda bir klasör alır ve bu klasörün içindeki tüm dosyaları alınır ve bu dosyalardan bir ArrayList yaratılır. Bu işlemleri updateList() method'u yapar.

  private void updateList(){
    theFileList=new ArrayList();
    File[] theDirectoryList=theDirectory.listFiles(new FileFilter(){
      public boolean accept(File f){
        return f.isDirectory();
      }
    });
    File[] theNormalFileList=theDirectory.listFiles(new FileFilter(){
      public boolean accept(File f){
        return !f.isDirectory();
      }
    });
    for(int i=0;i<theDirectoryList.length;i++){
      theFileList.add(theDirectoryList[i]);
    }
    for(int i=0;i<theNormalFileList.length;i++){
      theFileList.add(theNormalFileList[i]);
    }
  }

Klasör değiştiğinde model'imizin setDirectory() method'u çağrılır ve bu method'da updateList()'i çağırır.

  public void setDirectory(File directory){
    theDirectory=directory;
    updateList();
    fireTableDataChanged();
  }

fireTableDataChanged() methodu datanın değiştiğini bildirmek içindir. Data değiştiği zaman tablo yenilenir. Eğer fireTableDataChanged() method'unu çağırmassak tablonun bundan haberi olmaz ve yeni değerler gösterilmez.

Tabloda üç sütun olacak. İlk sütun için File nesnesi verilmektedir. (getValueAt methoduna bakınız.) İkinci sütunda eğer klasör değilse dosyanın boyutu yazılır. Üçüncü sütuna ise değiştirilme tarihi koyulmaktadır.

DirectoryTable

Göster Gizle Kopar Satır Gizle Satır Göster
  1 package com.godoro.test;
  2 import javax.swing.*;
  3 import javax.swing.event.*;
  4 import javax.swing.table.*;
  5 import java.awt.*;
  6 import java.awt.event.*;
  7 import java.io.*;
  8 public class DirectoryTable extends JTable{
  9   private File theDirectoryIcon,theNormalFileIcon;
 10   private DirectoryTableModel theModel;
 11   private File theDirectory;
 12   public DirectoryTable(File directory,File directoryIcon,File normalIcon){
 13     theDirectory=directory;
 14     theDirectoryIcon=directoryIcon;
 15     theNormalFileIcon=normalIcon;
 16     addMouseListener(new MouseAdapter(){
 17       public void mouseClicked(MouseEvent e){
 18         if(e.getClickCount()==2){
 19           clicked();
 20         }
 21       }
 22     });
 23     theModel=new DirectoryTableModel(directory);
 24     setModel(theModel);
 25     TableColumn tc=getColumnModel().getColumn(0);
 26     tc.setCellRenderer(getRenderer());
 27   }
 28   public void setDirectory(File directory){
 29     theDirectory=directory;
 30     theModel.setDirectory(theDirectory);
 31   }
 32   public void up(){
 33     File file=theDirectory.getParentFile();
 34     if(file!=null){
 35       setDirectory(file);
 36     }
 37   }
 38   private void clicked(){
 39     int row=getSelectedRow();
 40     File file=theModel.getFile(row);
 41     if(file.isDirectory()){
 42       setDirectory(file);
 43     }
 44   }
 45   private DefaultTableCellRenderer getRenderer(){
 46     return new DefaultTableCellRenderer(){
 47       public Component getTableCellRendererComponent(
 48           JTable table,Object value,
 49           boolean isSelected,
 50           boolean hasFocus,
 51           int row,
 52           int column)
 53       {
 54         File file=(File)value;
 55         JLabel label=(JLabel)super.getTableCellRendererComponent(table,file.getName(),isSelected,hasFocus,row,column);
 56         String iconName=theDirectoryIcon.getPath();
 57         if(!file.isDirectory()){
 58           iconName=theNormalFileIcon.getPath();
 59         }
 60         label.setIcon(new ImageIcon(iconName));
 61         return label;
 62       }
 63     };
 64   }
 65 }

Bu class JTable class'ını extend eder. İlk sütundaki hücrelere bir JLabel nesnesi koyar. Eğer dosya klasörse klasör ikonu, normal dosya ise dosya klasörü koyulmaktadır. JTable normalde hücredeki elementin toString'i çağırmaktadır. Biz ise bir JLabel nesnesi koyuyoruz. Bunun için

  private DefaultTableCellRenderer getRenderer(){
    return new DefaultTableCellRenderer(){
      public Component getTableCellRendererComponent(
          JTable table,Object value,
          boolean isSelected,
          boolean hasFocus,
          int row,
          int column)
      {
        File file=(File)value;
        JLabel label=(JLabel)super.getTableCellRendererComponent(table,file.getName(),isSelected,hasFocus,row,column);
        String iconName=theDirectoryIcon.getPath();
        if(!file.isDirectory()){
          iconName=theNormalFileIcon.getPath();
        }
        label.setIcon(new ImageIcon(iconName));
        return label;
      }
    };
  }

şeklinde bir method yararttık. Bu method DefaultTableCellRenderer göndermekte. getTableCellRendererComponent methodu tekrar yazılarak gösterilecek komponenti değiştirmeyi sağlıyoruz. Default olarak JTable bir JlLabel koyar.

super.getTableCellRendererComponent(table,file.getName(),isSelected,hasFocus,row,column);

ile biz bu label'ı aldık. Ve setIcon ile ikonunu set ettik. super'inin getTableCellRendererComponent methodunu çağırmak zorunda değildik. Tamamen yeni bir komponent yazıp gönderebilirdik. Anca bu yeni komponent için seçildiğinde nasıl gözükeceği, focus'landığında nasıl gözükeceği gibi özelliklerinide siz vermek zorundasınız. Halbuki biz zaten var olan JLabel component'ini kullandık.

Tablo bu DefaultTableCellRenderer'i sadece ilk sütun için kullanmaktadır. Diğer sütunlar için özel bir şey yapılmamıştır. İlk sütunun hücresi

TableColumn tc=getColumnModel().getColumn(0);
tc.setCellRenderer(getRenderer());

şeklinde set edilir. getRenderer() daha önce bahsedilen method'dur.

DirectoryTable class'ında yapılan başka bir şeyde bir klasör çift tıklandığında artık o klasörün içinin gösterilmesidir. Bunu

  private void clicked(){
    int row=getSelectedRow();
    File file=theModel.getFile(row);
    if(file.isDirectory()){
      setDirectory(file);
    }
  }

methodu yapmaktadır. Çift tıklama yapıldığında satır seçilmiş olur. Seçilen satırın kaçıncı satır olduğu öğrenilir. model'den bu satırdaki File istenir. Eğer file directory(klasör-dizin) ise setDirectory methodu çağrılır. Bu methot'da model'in setDirectory'sini çağırır. Böylece tıklanan klasörün içeriği görüntülenmiş olur. Yukarı düğmesi tıklandığında yapılan şey aynısıdır. Sadece şu andaki klasörün bir üst klasörü alınır ve setDirectory çağrılır.

Dosya Listesi

İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır