码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-08-28 22:23:11      阅读:317      评论:0      收藏:0      [点我收藏+]

标签:

接着上篇文章

 

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

 

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,并通过将 data 和 columnNames 传递到 setDataVector 方法来初始化该表。
DefaultTableModel(Object[] columnNames, int rowCount)
          构造一个 DefaultTableModel,它的列数与 columnNames 中元素的数量相同,并具有 rowCount 行 null 对象值。
DefaultTableModel(Vector columnNames, int rowCount)
          构造一个 DefaultTableModel,它的列数与 columnNames 中元素的数量相同,并具有 rowCount 行 null 对象值。
DefaultTableModel(Vector data, Vector columnNames)
          构造一个 DefaultTableModel,并通过将 data 和 columnNames 传递到 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);
    }
}
技术分享技术分享

 

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

标签:

原文地址:http://www.cnblogs.com/NGNL/p/5816113.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!