首页 > 代码库 > 【Java】 实现一个简单文件浏览器(2)
【Java】 实现一个简单文件浏览器(2)
接着上篇文章
接下来说下程序右侧的文件内容表格如何实现
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)