マイペースなプログラミング日記

DTMやプログラミングにお熱なd-kamiがマイペースに書くブログ

Javaでファイラーらしきものを作ってみる

Swing使ってファイラーらしきものを作ってみる。JTableと手抜きTableCellRendererを使ってファイル一覧を表示する。JTableがダブルクリックされ、クリックされたファイルがディレクトリならそのディレクトリに入っているファイル一覧を表示する。ファイルなら関連付けられたプログラムで開くを実行する。というところまできた。プログラミング自体にブランクがありいろいろツッコミどころがありそうだがなんとか作っていけたらいいな。


import java.awt.Color;
import java.awt.Desktop;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

import javax.swing.table.AbstractTableModel;
import javax.swing.filechooser.FileSystemView;

import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;

import java.io.File;
import java.io.IOException;

public class JFiler extends JTable{
    public static void main(String... args){
        SwingUtilities.invokeLater(JFiler::start);
    }
    
    private static void start(){
        var frame = new JFrame();
        
        var table = new JFiler();
        table.setPreferredSize(new Dimension(600, 500));
        
        var model = new FileModel();
        model.setCurrentDirectory(new File("./../"));
        table.setModel(model);

        table.getColumnModel().getColumn(0).setCellRenderer((t, value, isSelected, hasFocus, row, column) -> {
            var file = (File)value;
            var view = FileSystemView.getFileSystemView();
            var icon = view.getSystemIcon(file);
            var label = new JLabel(file.getName(), icon, JLabel.LEFT);
            
            if(isSelected){
                label.setOpaque(true);
                label.setBackground(new Color(0xCC, 0xCC, 0xFF));
            }
            
            return label;
        });
        
        table.addMouseListener(new MouseAdapter(){
            public void mouseClicked(MouseEvent e){
                if(SwingUtilities.isLeftMouseButton(e)){
                    leftClicked(e, table, model);
                }
            }
        });

        frame.add(table);
        frame.setVisible(true);
        frame.pack();
        
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    
    private static void leftClicked(MouseEvent e, JFiler table, FileModel model){
        if(e.getClickCount() == 2){
            var file = (File)model.getValueAt(table.getSelectedRow(), 0);

            if(file.isDirectory()){
                model.setCurrentDirectory(file);
                table.repaint();
            }else{
                try{
                    Desktop.getDesktop().open(file);
                }catch(IOException exception){
                    JOptionPane.showConfirmDialog(table, exception.getMessage());
                }
            }
        }
    }
    
    private static class FileModel extends AbstractTableModel{
        private File dir;
        private File[] children;
        
        public void setCurrentDirectory(File dir){
            this.dir = dir;
            this.children = dir.listFiles();
        }
        
        public int getRowCount(){
            return children.length;
        }
        
        public int getColumnCount(){
            return 1;
        }
        
        public Object getValueAt(int row, int column){
            return children[row];
        }
    }
}