ファイルをバイナリ形式で表示する (Java+Swing編)
ディレクトリツリーでノード(ディレクトリ)を選択したときに、ファイル一覧ビューで選択したディレクトリ直下のサブディレクトリとファイル名を一覧表示します。
処理の流れは以下のようになります。
ディレクトリの選択が変更されるときのイベントハンドラ
ファイル一覧ビューの表示を更新する
ルートノード(コンピュータ名)を選択した場合
ファイル一覧にドライブ名リストを表示する
ルートノード以外を選択した場合
ファイル一覧にディレクトリ名またはファイル名を表示する
ディレクトリツリーのノードが選択されたときに呼び出されるイベント処理です。
ディレクトリツリーのノードが選択されたときのイベントハンドラはの登録は、FileTreeViewのコンストラクタで行います。
ソースコードを以下に示します。
FileTreeView.java
//! ディレクトリの選択が変更されるときのイベント処理を登録する.
addTreeSelectionListener( new TreeSelectionListener(){
@Override
public void valueChanged( TreeSelectionEvent e ){
fileTreeSelectChanged( e );
}
});
ディレクトリの選択が変更されるときのイベントハンドラでは、選択されたノードに対応したディレクトリの絶対パスを取得して、メインフレームに対してファイル一覧を表示するディレクトリが変更されることを通知します。
FileTreeView.java
/* ----------------------------------------------------------------------- */
/**
* ディレクトリの選択が変更されるときのイベント処理.
*
* @param e イベントパラメータ.
*/
private void fileTreeSelectChanged( TreeSelectionEvent e ) {
//! 選択されたディレクトリのフルパスを取得する.
TreePath path = e.getPath();
String filePath = getAbsolutePath( path );
//! ファイル一覧の表示を更新する.
notifyEvent.updateFileList( filePath );
}
JavaSwing001.java
/* ----------------------------------------------------------------------- */
/**
* ファイル一覧を更新する.
*
* @param path 一覧表示するディレクトリの絶対パス.
*/
public void updateFileList( String path ) {
//! ファイル一覧を更新する.
fileListView.updateFileList( path );
}
FileListView.java
/* ----------------------------------------------------------------------- */
/**
* ファイル一覧を更新する.
*
* @param path 一覧表示するディレクトリ名.
*
*/
public void updateFileList( String path ) {
//! 一覧表示するディレクトリ名を保存する.
currentDir = path;
DefaultTableModel model = (DefaultTableModel)getModel();
if( path.length() > 0 ){
//! 指定されたパスのファイル一覧を生成する.
showFileName( model, path );
}else{
//! パスが指定されていない場合はドライブ一覧を生成する.
showDriveName( model );
}
}
引数で指定されたディレクトリの絶対パスがファイル一覧ビューのカレントパスとなるので保存しておきます。
ファイル一覧に表示するディレクトリの絶対パスが指定された場合は、該当するディレクトリのファイル一覧を表示します。
ファイル一覧に表示するディレクトリの絶対パスが指定されなかった場合は、ドライブ名一覧を表示します。
FileListView.java
/* ----------------------------------------------------------------------- */
/**
* ファイル一覧にドライブ名を表示する.
*
* @param model リストビューのテーブル・モデル.
*
*/
private void showDriveName( DefaultTableModel model ) {
//! ファイル一覧の表示を一旦クリアする.
model.setRowCount( 0 );
//! 論理ドライブ名をすべて取得する.
File[] roots = File.listRoots();
for( File drv : roots ){
//! ドライブ名をファイル一覧に追加する.
model.addRow( new File[] { drv, drv, drv } );
}
}
ファイル一覧ビューに表示するドライブ名を表示リストに追加します。
最初に現在表示しているリストをクリアします。
次にFile.listRoots()を呼び出してコンピュータに接続されている有効なドライブのドライブ名リストを取得します。
for()ループで回しながらドライブ名リストからドライブ名のファイル情報を取り出します。
表示リストに追加する情報は以下のとおりです。
項目 | 値 |
---|---|
ファイル名 | ファイル・オブジェクト |
ファイルサイズ | ファイル・オブジェクト |
更新日時 | ファイル・オブジェクト |
FileListView.java
/* ----------------------------------------------------------------------- */
/**
* ファイル一覧にファイル名の一覧を表示する.
*
* @param model リストビューのテーブル・モデル.
* @param path ファイル一覧を表示するディレクトリの絶対パス.
*
*/
private void showFileName( DefaultTableModel model, String path ) {
//! ファイル一覧の表示を一旦クリアする.
model.setRowCount( 0 );
//! 一つ上のディレクトリに移動する為の「..」をリストの先頭に追加する.
model.addRow( new String[] { "..", "<DIR>", "" } );
//! 指定されたディレクトリ直下のファイルとディレクトリのリストを取得する.
path += "\\";
File dir = new File( path );
File[] files = dir.listFiles();
if( files == null ){
return;
}
//! 先にサブディレクトリ名をリストに追加する.
for( int i = 0; i < files.length; i++ ){
File file = files[i];
//! 隠しファイルまたは読み込み不可のファイルは表示しない.
if( file.isHidden() || !file.canRead() ){
continue;
}
//! 先にディレクトリを表示するのでファイルの場合は表示しない.
if( !file.isDirectory() ){
continue;
}
//! サブディレクトリをファイル一覧に追加する.
model.addRow( new File[] { file, file, file } );
}
//! 次にファイル名をリストに追加する.
for( int i = 0; i < files.length; i++ ){
File file = files[i];
//! 隠しファイルまたは読み込み不可のファイルは表示しない.
if( file.isHidden() || !file.canRead() ){
continue;
}
//! ディレクトリは既に表示済みなので表示しない.
if( file.isDirectory() ){
continue;
}
//! ファイル名をファイル一覧に追加する.
model.addRow( new File[] { file, file, file } );
}
}
ファイル一覧ビューに表示するディレクトリ名とファイル名をに追加します。
最初に現在表示しているリストをクリアします。
一つ上のディレクトリに移動する為の「..」をリストの先頭に追加します。
項目 | 値 |
---|---|
ファイル名 | 「..」 |
ファイルサイズ | 「<DIR>」 |
更新日時 | 空白 |
File.listFiles()を呼び出して、指定されたディレクトリ直下のファイルとディレクトリのリストを取得します。
先にサブディレクトリ名を表示リストに追加します。
for()ループで回しながらファイルリストから「ディレクトリ」のファイル情報を取り出します。
以下のファイル情報は表示リストに追加しません。
- 隠しファイルまたは読み込み不可のファイル。
- ファイル (先にディレクトリを表示する為)。
表示リストに追加する「ディレクトリ」のファイル情報は以下のとおりです。
項目 | 値 |
---|---|
ファイル名 | ファイル・オブジェクト |
ファイルサイズ | ファイル・オブジェクト |
更新日時 | ファイル・オブジェクト |
次にファイル名を表示リストに追加します。
for()ループで回しながらファイルリストから「ファイル」のファイル情報を取り出します。
以下のファイル情報は表示リストに追加しません。
- 隠しファイルまたは読み込み不可のファイル。
- ディレクトリ (ディレクトリは既に表示済みの為)。
表示リストに追加する「ファイル」のファイル情報は以下のとおりです。
項目 | 値 |
---|---|
ファイル名 | ファイル・オブジェクト |
ファイルサイズ | ファイル・オブジェクト |
更新日時 | ファイル・オブジェクト |
FileListView.java
/* ----------------------------------------------------------------------- */
/**
* ファイル名のセルレンダラー.
*
*/
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 );
String str = "";
if( value instanceof File ){
File file = (File)value;
if( fs.isDrive( file ) ){
//! ドライブの場合パスからドライブレターを取り出す.
String path = file.toString();
int pos = path.lastIndexOf( '\\' );
str = path.substring( 0, pos );
}else{
//! ファイル名をリストに追加する.
str = fs.getSystemDisplayName( file );
}
}else
if( value instanceof String ){
//! 文字列の場合はそのままリストに追加する.
str = (String)value;
}
//! リストにファイル名を追加する.
setText( str );
return this;
}
}
リスト項目「ファイル名」を描画します。
表示するデータがファイル・オブジェクトの場合。
ファイル種別がドライブの場合、ドライブ名の最後にセパレータ文字「\」が付いているので、これを取り除いて表示します。
ファイル種別がディレクトリまたはファイルの場合、ファイル・オブジェクトからファイル名を取得して表示します。
表示するデータが文字列の場合。
そのまま文字列を表示します。
FileListView.java
/* ----------------------------------------------------------------------- */
/**
* ファイルサイズのセルレンダラー.
*
*/
class FileSizeTableCellRenderer 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 );
String str = "";
if( value instanceof File ){
File file = (File)value;
if( fs.isDrive( file ) ){
//! ドライブの場合は""(空白)をリストに追加する.
}else
if( file.isDirectory() ){
//! ディレクトリの場合は「<DIR>」をリストに追加する.
str = "<DIR>";
}else{
//!ファイルの場合ファイルサイズをカンマ区切りで編集してリストに追加する.
str = String.format( "%1$,3d ", file.length() );
}
}else
if( value instanceof String ){
//! 文字列の場合はそのままリストに追加する.
str = (String)value;
}
//! リストにファイルサイズを追加する.
setText( str );
//! 文字列を右寄せにする.
setHorizontalAlignment( RIGHT );
return this;
}
}
リスト項目「ファイルサイズ」を描画します。
表示するデータがファイル・オブジェクトの場合。
ファイル種別がドライブの場合、空白を表示します。
ファイル種別がディレクトリの場合、「<DIR>」を表示します。
ファイル種別がファイルの場合、ファイル・オブジェクトからファイルサイズを取得して表示します。
表示するデータが文字列の場合。
そのまま文字列を表示します。
表示する文字列は右寄せにします。
FileListView.java
/* ----------------------------------------------------------------------- */
/**
* 更新日付のセルレンダラー.
*
*/
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 );
String str = "";
if( value instanceof File ){
File file = (File)value;
if( file.isFile() ){
//! ファイルの場合は更新日付を文字列にする.
SimpleDateFormat sdf = new SimpleDateFormat( "yyyy/MM/dd hh:mm" );
str = sdf.format( new Date( file.lastModified() ) );
}
}else
if( value instanceof String ){
//! 文字列の場合はそのままリストに追加する.
str = (String)value;
}
//! リストにファイルサイズを追加する.
setText( str );
return this;
}
}
表示するデータがファイル・オブジェクトの場合。
ファイル種別がドライブの場合、空白を表示します。
ファイル種別がディレクトリの場合、空白を表示します。
ファイル種別がファイルの場合、ファイル・オブジェクトから更新日付を取得して表示します。
表示するデータが文字列の場合。
そのまま文字列を表示します。