ファイルをバイナリ形式で表示する (Java+Swing編)

ファイル一覧でファイルを選択したときの処理

ファイル一覧で表示中のファイル名またはディレクトリ名をダブルクリックしたときに、クリックしたのがファイル名であれば、現在表示中のファイルデータの内容をクリックされたファイル名のデータに更新します。

クリックされたのがディレクトリ名であればファイル一覧の表示をクリックされたディレクトリの一覧に更新します。

リストビューをダブルクリックしたときのイベントハンドラ

ディレクトリ名をダブルクリックした場合

メインフレームへカレントディレクトリが変更されることを通知する

ディレクトリツリーの選択ノードを変更する

ファイル一覧の表示を変更する

ファイル名をダブルクリックした場合

メインフレームへ表示するファイルが変更されることを通知する

ファイルを読み込む

ファイルデータの表示を変更する


リストビューの項目をダブルクリックしたときのイベントハンドラ

FileListView.java


/* ----------------------------------------------------------------------- */
/**
 *  ファイル一覧の項目がダブルクリックされたときの操作イベント.
 *
 * @param   me      マウス・イベントのイベント・パラメータ.
 *
 */
private void onDblClick( MouseEvent me ) {

    //! リストビューから選択された項目番号を取り出す.
    Point pt = me.getPoint();
    int idx = rowAtPoint( pt );
    if( idx >= 0 ){
        int row = convertRowIndexToModel( idx );

        DefaultTableModel model = (DefaultTableModel)getModel();

        Object value = model.getValueAt( row, 0 );
        if( value instanceof File ){
            String filename = value.toString();
            if( filename.length() > 0 ){
                File file = new File( filename );
                if( file.isFile() ){
                    //! ファイルの場合はバイナリ表示する.
                    notifyEvent.showBinaryFile( filename );
                }else{
                    //! ディレクトリの場合は選択されたディレクトリに移動する.
                    notifyEvent.expandDirectory( filename );
                }
            }
        }else
        if( value instanceof String ){
            String name = (String)value;

            if( name.equals( ".." ) ){
                //! ".."の場合、カレントパスの最後のディレクトリ名を取り除く.
                String path = "";
                int    pos  = currentDir.lastIndexOf( '\\' );
                if( pos >= 0 ){
                    path = currentDir.substring( 0, pos );
                }
                notifyEvent.expandDirectory( path );
            }
        }
    }
}
	

リストビューの項目をダブルクリックしたときのイベント処理を行います。

ダブルクリックされたマウス位置からリストの行番号を取り出します。

ダブルクリックされた行の「ファイル名」のオブジェクトを取り出します。

オブジェクトがファイル・オブジェクトの場合。

ダブルクリックされたファイル名が「ファイル」の場合、ファイルの内容をバイナリ形式で表示する為に、ファイル名を通知します。

ダブルクリックされたファイル名が「ディレクトリ」の場合、ディレクトリの移動を通知します。

オブジェクトが文字列オブジェクトの場合。

文字列が「..」の場合、1つ上の階層にディレクトリとなるので、現在表示中のディレクトリの絶対パスから最後のディレクトリ名を取り除いてディレクトリの移動を通知します。

カレントディレクトリが変更されることを通知する

ファイル一覧ビューからディレクトリツリー・ビューに対する表示ディレクトリの変更通知を受け取ります。

JavaSwing001.java


/* ----------------------------------------------------------------------- */
/**
 *  指定したディレクトリを展開表示する.
 *
 *  @param  path    展開するディレクトリの絶対パス.
 */
public void expandDirectory( String path ) {

    //! ディレクトリツリーの該当ディレクトリを展開する.
    fileTreeView.expandAndSelectDirectory( path );

    //! ファイル一覧を更新する.
    fileListView.updateFileList( path );
}
	

受け取ったファイルの絶対パス名をディレクトリツリー・ビューに通知します。

ファイル一覧ビューに対しても折り返してディレクトリの絶対パス名を通知して一覧表示を更新します。

FileTreeView.java


/* ----------------------------------------------------------------------- */
/**
 *  指定されたディレクトリまでのノードを展開する.
 *
 *  @param  path    ディレクトリの絶対パス名.
 */
public void expandAndSelectDirectory( String path ) {

    TreeModel model = getModel();

    DefaultMutableTreeNode node = (DefaultMutableTreeNode)model.getRoot();

    //! indexOf()検索で最後まで検索するようにパスの最後に検索文字を付加する.
    String wkPath = path + "\\";

    int next;
    int pos = 0;
    while( node != null && (next = wkPath.indexOf( '\\', pos )) != -1 ){

        //! 子ノードが無い場合は処理を終了する.
        if( model.getChildCount( node ) == 0 ){
            node = null;
            break;
        }
        //! "\"が連続している場合は読み飛ばす.
        if( next == pos ){
            pos = next + 1;
            continue;
        }
        //! ディレクトリ名を絶対パスから取り出す.
        String dirName = wkPath.substring( pos, next );
        pos = next + 1;

        for( int i = 0; i < model.getChildCount( node ); i++ ){

            DefaultMutableTreeNode child = (DefaultMutableTreeNode)model.getChild( node, i );

            //! 同じディレクトリ名のノードを見つけたらループを抜ける.
            if( dirName.compareToIgnoreCase( child.toString() ) == 0 ){
                node = child;
                break;
            }
        }
    }
    if( node != null ){
        TreePath treePath = new TreePath( node.getPath() );

        //! 選択されたノードまでを展開する.
        expandPath( treePath );

        //! ノードを選択状態にする.
        setSelectionPath( treePath );
    }
}
	

指定されたディレクトリまでのノードを展開して該当ノードを選択状態にします。

指定された絶対パスのディレクトリ名から、各ディレクトリ名を取り出す為にString.indexOf()メソッドでセパレータ「\」で区切って取り出すのですが、指定された絶対パスのディレクトリ名は最後にセパレータ文字が付いていないので、「\」を絶対パスの最後に付加します。

ルートノードから子ノードのディレクトリ名と指定された絶対パスのディレクトリ名から取り出したディレクトリ名を比較して、一致した子ノードから孫ノードのディレクトリ名と指定された絶対パスのディレクトリ名から取り出した次のディレクトリ名を比較して、一致したら....
という具合に指定された絶対パスのディレクトリ名が無くなるまで繰り返します。

最後まで探索して見つかったノードまでを展開し、選択状態にします。

表示するファイルの変更を通知する

JavaSwing001.java


/* ----------------------------------------------------------------------- */
/**
 *  ファイルの内容をバイナリ形式で表示する.
 *
 *  @param  path    バイナリ表示するファイルの絶対パス.
 */
public void showBinaryFile( String path ) {

    //! バイナリ表示ウインドウに表示するファイル名を通知する.
    fileDataView.showBinaryFile( path );

    //! ステータスバーにファイル名を表示する.
    statusBar.setText( path );
}
	

ファイル一覧ビューからバイナリデータ表示ビューに対する表示ファイル名の変更通知を受け取ります。

受け取ったファイルの絶対パス名をバイナリデータ表示ビューに通知します。

ステータスバーにも受け取ったファイルの絶対パス名を通知します。



商標に関する表示