JTableエクスプローラ風サンプル

  • C:\直下のファイル一覧をJTableに表示するサンプルです。
  • ファイル名のカラムはファイル名とアイコンを、ファイルサイズのカラムはカンマ区切り右寄せ、日付のカラムは右寄せで表示します。
  • カラム毎に表示を切り替えるには、DefaultTableCellRendererを継承して、各カラムのレンダラーを作成します。
  • もっとエクスプローラに近い見た目にするには、以下のサイトを参考にするといいです

JTableのセルをエクスプローラ風に表示する - Java Swing Tips
http://terai.xrea.jp/Swing/ExplorerLikeTable.html

サンプルダウンロード


ソース

import java.awt.Component;
import java.io.File;
import java.sql.Date;
import java.text.SimpleDateFormat;
 
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.filechooser.FileSystemView;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
 
/*
 * JTableエクスプローラ風サンプル
 * ・C:\直下のファイル一覧をJTableに表示するサンプルです。
 * ・ファイル名のカラムはファイル名とアイコンを、ファイルサイズのカラムはカンマ区切り右寄せ、日付のカラムは右寄せで表示します。
 * ・カラム毎に表示を切り替えるには、DefaultTableCellRendererを継承して、各カラムのレンダラーを作成します。
 */
public class PathToJTable extends JFrame {
	JTable tbl;
	DefaultTableModel model;
 
	public static void main(String[] args) {
		new PathToJTable();
	}
 
	public PathToJTable() {
		setTitle("エクスプローラ風JTable");
		setBounds(200, 100, 400, 200);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
 
		// C:\のファイル一覧を取得
		File path = new File("C:\\");
		File[] files = path.listFiles();
 
		// モデルを生成
		model = new DefaultTableModel();
		// カラム名ほ設定
		model.setColumnIdentifiers(new String[] { "ファイル名", "サイズ", "日付" });
 
		// ファイル名、サイズ、日付の分だけ全部Fileの配列にして行を追加
		for (File file : files) {
			model.addRow(new File[] { file, file, file });
		}
 
		// テーブルモデルからJTableを作成
		tbl = new JTable(model);
 
		// それぞれのカラムにレンダラーを設定
		tbl.getColumnModel().getColumn(0)
				.setCellRenderer(new FileNameTableCellRenderer());
		tbl.getColumnModel().getColumn(1)
				.setCellRenderer(new FileSizeTableCellRenderer());
		tbl.getColumnModel().getColumn(2)
				.setCellRenderer(new FileDateTableCellRenderer());
 
		// JTableをフレームに追加
		add(new JScrollPane(tbl));
 
		setVisible(true);
	}
 
	// ファイル名セルレンダラー
	class FileNameTableCellRenderer extends DefaultTableCellRenderer {
		FileSystemView fs = FileSystemView.getFileSystemView();
 
		@Override
		public Component getTableCellRendererComponent(JTable table,
				Object value, boolean isSelected, boolean hasFocus, int row,
				int column) {
			super.getTableCellRendererComponent(table, value, isSelected,
					hasFocus, row, column);
 
			if (value instanceof File) {
				File f = (File) value;
				// ファイル名とアイコン
				setText(fs.getSystemDisplayName(f));
				setIcon(fs.getSystemIcon(f));
			}
 
			return this;
		}
	}
 
	// ファイルサイズセルレンダラー
	class FileSizeTableCellRenderer extends DefaultTableCellRenderer {
		@Override
		public Component getTableCellRendererComponent(JTable table,
				Object value, boolean isSelected, boolean hasFocus, int row,
				int column) {
			super.getTableCellRendererComponent(table, value, isSelected,
					hasFocus, row, column);
 
			if (value instanceof File) {
				File f = (File) value;
				// ファイルサイズ(カンマ区切り
				setText(String.format("%1$,3d", f.length()));
				setHorizontalAlignment(RIGHT);
			}
 
			return this;
		}
	}
 
	// 日付セルレンダラー
	class FileDateTableCellRenderer extends DefaultTableCellRenderer {
		@Override
		public Component getTableCellRendererComponent(JTable table,
				Object value, boolean isSelected, boolean hasFocus, int row,
				int column) {
			super.getTableCellRendererComponent(table, value, isSelected,
					hasFocus, row, column);
 
			if (value instanceof File) {
				File f = (File) value;
				SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd hh:mm");
				setText(sdf.format(new Date(f.lastModified())));
			}
 
			return this;
		}
	}
}
 

コメント

最終更新:2012年12月16日 00:39