【Java】 实现一个简单文件浏览器(2)

896 阅读7分钟

接下来说下程序右侧的文件内容表格如何实现

FileTable类:

FileTable基础于JTable类,构造函数里用setDefaultRenderer设置每行默认的渲染器为FileTableCellRenderer(下面会说如何实现)

setAutoCreateRowSorter(true)函数自动创建一个默认的排序筛选器,等同于:setRowSorter(new TableRowSorter(model))

RowSorter:默认情况下,如果启用排序,那么排序时 JTable 将保留基于模型的选择和可变行高度。例如,如果当前选择行 0(就底层模型而言),那么排序之后将选择行 0(就底层模型而言)。选择有可能看起来被更改了,但就底层模型而言它仍然保持不变。模型索引不再可见或者被移除时除外。例如,如果行 0 被过滤掉了,那么选择在排序后将为空。 

this.setShowHorizontalLines(false);和this.setShowVerticalLines(false);设置表格中不绘制单元格周围的横向和纵向网格线

package FileTable;

import java.awt.Dimension;
import java.io.File;
import java.util.Comparator;

import javax.swing.JTable;
import javax.swing.table.TableModel;

/**
 * Created by Administrator on 2016/3/29.
 */
public class FileTable extends JTable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public FileTable(){
        this.setDefaultRenderer(Object.class, new FileTableCellRenderer());
        this.setAutoCreateRowSorter(true);
        this.getTableHeader().setReorderingAllowed(false);
        this.setShowHorizontalLines(false);
        this.setShowVerticalLines(false);
        setIntercellSpacing(new Dimension(0,0)); //修改单元格间隔,因此也将影响网格线的粗细。
        setRowMargin(0);//设置相邻两行单元格的距离
    }

    @Override
    public void setModel(TableModel dataModel) {
        super.setModel(dataModel);

    }
}

FileTableCellRenderer类:

FileTableCellRenderer继承与TableCellRenderer ,返回用于绘制单元格的组件。此方法用于在绘制前适当地配置渲染器。 

主要目的是重载getTableCellRendererComponent(),里面根据不同列,显示不同数据。如第0列显示文件图标和文件名,第二列显示文件修改时间,第三列显示文件类型,第四列显示文件大小

package FileTable;

import java.awt.Component;
import java.io.File;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.filechooser.FileSystemView;
import javax.swing.table.TableCellRenderer;

/**
 * Created by Administrator on 2016/3/29.
 */
public class FileTableCellRenderer extends JLabel implements TableCellRenderer {

    private static final long serialVersionUID = 1L;
    FileSystemView fileSystemView = FileSystemView.getFileSystemView();
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        this.setFont(table.getFont());
        setOpaque(true);
        setEnabled(table.isEnabled());
        if (isSelected) {
            this.setBackground(table.getSelectionBackground());
            this.setForeground(table.getSelectionForeground());
//            fileTable.setShowHorizontalLines(true);
//            fileTable.setShowVerticalLines(true);
        }
        else {
            this.setBackground(table.getBackground());
            this.setForeground(table.getForeground());
//            fileTable.setShowHorizontalLines(false);
//            fileTable.setShowVerticalLines(false);
        }

        if (column == 0)  {
            File file = (File) value;
            this.setText(fileSystemView.getSystemDisplayName(file));
            this.setIcon(fileSystemView.getSystemIcon(file));
        }
        else if (column == 1) {
            long datetime = (long)value;
            SimpleDateFormat sdf = new SimpleDateFormat(" yyyy/MM/dd/ HH:mm:ss");
            Date date = new Date(datetime);
            this.setText(sdf.format(date));
            this.setIcon(null);
        } else if (column == 2) {
            String description = (String)value;
            this.setText(description);
            this.setIcon(null);
        } else if (column == 3) {
            long size = (long)value;
            String fileSize = FormetFileSize(size);
            File file = (File)table.getValueAt(row,0);
            if (fileSystemView.isComputerNode(file) || fileSystemView.isDrive(file) || file.isDirectory()){
                this.setText(null);
            } else {
                this.setText(fileSize);
            }
            this.setIcon(null);
        }
        return this;
    }

    public String FormetFileSize(long fileS) {//转换文件大小
        DecimalFormat df = new DecimalFormat("#.00");
        String fileSizeString = "";
        if (fileS == 0){
            return fileSizeString;
        }
        if (fileS < 1024) {
            fileSizeString = df.format((double) fileS) + "B";
        } else if (fileS < 1048576) {
            fileSizeString = df.format((double) fileS / 1024) + "K";
        } else if (fileS < 1073741824) {
            fileSizeString = df.format((double) fileS / 1048576) + "M";
        } else {
            fileSizeString = df.format((double) fileS / 1073741824) +"G";
        }
        return fileSizeString;
    }
}

FileTableModel 类:

FileTable继承与DefaultTableModel类

静态变量tableHeader 存储的是表格标题

DefaultTableModel有4种构造函数, 这里我选择第三种,通过数据的二维数组和表头数组来初始化

DefaultTableModel()
          构造默认的 DefaultTableModel,它是一个零列零行的表。
DefaultTableModel(int rowCount, int columnCount)
          构造一个具有 rowCount 行和 columnCount 列的 null 对象值的 DefaultTableModel
DefaultTableModel(Object[][] data, Object[] columnNames)
          构造一个 DefaultTableModel,并通过将 datacolumnNames 传递到 setDataVector 方法来初始化该表。
DefaultTableModel(Object[] columnNames, int rowCount)
          构造一个 DefaultTableModel,它的列数与 columnNames 中元素的数量相同,并具有 rowCountnull 对象值。
DefaultTableModel(Vector columnNames, int rowCount)
          构造一个 DefaultTableModel,它的列数与 columnNames 中元素的数量相同,并具有 rowCountnull 对象值。
DefaultTableModel(Vector data, Vector columnNames)
          构造一个 DefaultTableModel,并通过将 datacolumnNames 传递到 setDataVector 方法来初始化该表。

通过重载getValueAt()函数,返回对应行列的值。重载CellEditable() 试其返回false 让表格内容不能被编辑。
 

package FileTable;

import java.io.File;

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

/**
 * Created by Administrator on 2016/3/29.
 */
public class FileTableModel extends DefaultTableModel {

    private static final long serialVersionUID = 1L;
    private static String[] tableHeader = {"名称", "修改日期", "类型", "大小"};
    private FileSystemView fileSystemView = FileSystemView.getFileSystemView();
    public FileTableModel(Object[][] objects){
        super(objects, tableHeader);
    }

    @Override
    public boolean isCellEditable(int row, int column) {
        return false;
    }


    @Override
    public Object getValueAt(int row, int column) {
        File file = (File) super.getValueAt(row, column);
        if (column == 0){
            return file;
        } else if (column == 1){
            return file.lastModified();
        } else if (column == 2) {
            return fileSystemView.getSystemTypeDescription(file);
        } else if (column == 3){
            return file.length();
        }
        return super.getValueAt(row, column);
    }
}

本文链接: www.bugcoding.com/entry/16

版权所有。转载时必须以链接形式注明作者和原始出处及本声明。

接下来说下程序右侧的文件内容表格如何实现

FileTable类:

FileTable基础于JTable类,构造函数里用setDefaultRenderer设置每行默认的渲染器为FileTableCellRenderer(下面会说如何实现)

setAutoCreateRowSorter(true)函数自动创建一个默认的排序筛选器,等同于:setRowSorter(new TableRowSorter(model))

RowSorter:默认情况下,如果启用排序,那么排序时 JTable 将保留基于模型的选择和可变行高度。例如,如果当前选择行 0(就底层模型而言),那么排序之后将选择行 0(就底层模型而言)。选择有可能看起来被更改了,但就底层模型而言它仍然保持不变。模型索引不再可见或者被移除时除外。例如,如果行 0 被过滤掉了,那么选择在排序后将为空。 

this.setShowHorizontalLines(false);和this.setShowVerticalLines(false);设置表格中不绘制单元格周围的横向和纵向网格线

package FileTable;

import java.awt.Dimension;
import java.io.File;
import java.util.Comparator;

import javax.swing.JTable;
import javax.swing.table.TableModel;

/**
 * Created by Administrator on 2016/3/29.
 */
public class FileTable extends JTable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public FileTable(){
        this.setDefaultRenderer(Object.class, new FileTableCellRenderer());
        this.setAutoCreateRowSorter(true);
        this.getTableHeader().setReorderingAllowed(false);
        this.setShowHorizontalLines(false);
        this.setShowVerticalLines(false);
        setIntercellSpacing(new Dimension(0,0)); //修改单元格间隔,因此也将影响网格线的粗细。
        setRowMargin(0);//设置相邻两行单元格的距离
    }

    @Override
    public void setModel(TableModel dataModel) {
        super.setModel(dataModel);

    }
}

FileTableCellRenderer类:

FileTableCellRenderer继承与TableCellRenderer ,返回用于绘制单元格的组件。此方法用于在绘制前适当地配置渲染器。 

主要目的是重载getTableCellRendererComponent(),里面根据不同列,显示不同数据。如第0列显示文件图标和文件名,第二列显示文件修改时间,第三列显示文件类型,第四列显示文件大小

package FileTable;

import java.awt.Component;
import java.io.File;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.filechooser.FileSystemView;
import javax.swing.table.TableCellRenderer;

/**
 * Created by Administrator on 2016/3/29.
 */
public class FileTableCellRenderer extends JLabel implements TableCellRenderer {

    private static final long serialVersionUID = 1L;
    FileSystemView fileSystemView = FileSystemView.getFileSystemView();
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        this.setFont(table.getFont());
        setOpaque(true);
        setEnabled(table.isEnabled());
        if (isSelected) {
            this.setBackground(table.getSelectionBackground());
            this.setForeground(table.getSelectionForeground());
//            fileTable.setShowHorizontalLines(true);
//            fileTable.setShowVerticalLines(true);
        }
        else {
            this.setBackground(table.getBackground());
            this.setForeground(table.getForeground());
//            fileTable.setShowHorizontalLines(false);
//            fileTable.setShowVerticalLines(false);
        }

        if (column == 0)  {
            File file = (File) value;
            this.setText(fileSystemView.getSystemDisplayName(file));
            this.setIcon(fileSystemView.getSystemIcon(file));
        }
        else if (column == 1) {
            long datetime = (long)value;
            SimpleDateFormat sdf = new SimpleDateFormat(" yyyy/MM/dd/ HH:mm:ss");
            Date date = new Date(datetime);
            this.setText(sdf.format(date));
            this.setIcon(null);
        } else if (column == 2) {
            String description = (String)value;
            this.setText(description);
            this.setIcon(null);
        } else if (column == 3) {
            long size = (long)value;
            String fileSize = FormetFileSize(size);
            File file = (File)table.getValueAt(row,0);
            if (fileSystemView.isComputerNode(file) || fileSystemView.isDrive(file) || file.isDirectory()){
                this.setText(null);
            } else {
                this.setText(fileSize);
            }
            this.setIcon(null);
        }
        return this;
    }

    public String FormetFileSize(long fileS) {//转换文件大小
        DecimalFormat df = new DecimalFormat("#.00");
        String fileSizeString = "";
        if (fileS == 0){
            return fileSizeString;
        }
        if (fileS < 1024) {
            fileSizeString = df.format((double) fileS) + "B";
        } else if (fileS < 1048576) {
            fileSizeString = df.format((double) fileS / 1024) + "K";
        } else if (fileS < 1073741824) {
            fileSizeString = df.format((double) fileS / 1048576) + "M";
        } else {
            fileSizeString = df.format((double) fileS / 1073741824) +"G";
        }
        return fileSizeString;
    }
}

FileTableModel 类:

FileTable继承与DefaultTableModel类

静态变量tableHeader 存储的是表格标题

DefaultTableModel有4种构造函数, 这里我选择第三种,通过数据的二维数组和表头数组来初始化

DefaultTableModel()
          构造默认的 DefaultTableModel,它是一个零列零行的表。
DefaultTableModel(int rowCount, int columnCount)
          构造一个具有 rowCount 行和 columnCount 列的 null 对象值的 DefaultTableModel
DefaultTableModel(Object[][] data, Object[] columnNames)
          构造一个 DefaultTableModel,并通过将 datacolumnNames 传递到 setDataVector 方法来初始化该表。
DefaultTableModel(Object[] columnNames, int rowCount)
          构造一个 DefaultTableModel,它的列数与 columnNames 中元素的数量相同,并具有 rowCountnull 对象值。
DefaultTableModel(Vector columnNames, int rowCount)
          构造一个 DefaultTableModel,它的列数与 columnNames 中元素的数量相同,并具有 rowCountnull 对象值。
DefaultTableModel(Vector data, Vector columnNames)
          构造一个 DefaultTableModel,并通过将 datacolumnNames 传递到 setDataVector 方法来初始化该表。

通过重载getValueAt()函数,返回对应行列的值。重载CellEditable() 试其返回false 让表格内容不能被编辑。
 

package FileTable;

import java.io.File;

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

/**
 * Created by Administrator on 2016/3/29.
 */
public class FileTableModel extends DefaultTableModel {

    private static final long serialVersionUID = 1L;
    private static String[] tableHeader = {"名称", "修改日期", "类型", "大小"};
    private FileSystemView fileSystemView = FileSystemView.getFileSystemView();
    public FileTableModel(Object[][] objects){
        super(objects, tableHeader);
    }

    @Override
    public boolean isCellEditable(int row, int column) {
        return false;
    }


    @Override
    public Object getValueAt(int row, int column) {
        File file = (File) super.getValueAt(row, column);
        if (column == 0){
            return file;
        } else if (column == 1){
            return file.lastModified();
        } else if (column == 2) {
            return fileSystemView.getSystemTypeDescription(file);
        } else if (column == 3){
            return file.length();
        }
        return super.getValueAt(row, column);
    }
}

本文链接: www.bugcoding.com/entry/16

版权所有。转载时必须以链接形式注明作者和原始出处及本声明。