【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);
}
}
本文链接: http://www.bugcoding.com/entry/16
版权所有。转载时必须以链接形式注明作者和原始出处及本声明。
【Java】 实现一个简单文件浏览器(2)的更多相关文章
- 【Java】 实现一个简单文件浏览器(1)
学习Java的Swing的时候写的一个超简单文件浏览器 效果如图: 项目结构: 这里面主要用了两个控件,JTree和JTable 下面先说下左侧的文件树如何实现: 首先是FileTree类,继承于JT ...
- Java实现一个简单的文件上传案例
Java实现一个简单的文件上传案例 实现流程: 1.客户端从硬盘读取文件数据到程序中 2.客户端输出流,写出文件到服务端 3.服务端输出流,读取文件数据到服务端中 4.输出流,写出文件数据到服务器硬盘 ...
- 使用 java 实现一个简单的 markdown 语法解析器
1. 什么是 markdown Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用.看到这里请不要被「标记」.「语言」所迷惑,Markdown 的 ...
- Pyqt 一个简单的浏览器
使用QtWebKit 做一个简单的浏览器. mybrowserUI.ui <?xml version="1.0" encoding="UTF-8"?> ...
- 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小
原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...
- java:jsp: 一个简单的自定义标签 tld
java:jsp: 一个简单的自定义标签 tld 请注意,uri都是:http://www.tag.com/mytag,保持统一,要不然报错,不能访问 tld文件 <?xml version=& ...
- Android简单文件浏览器源代码 (转)
Android简单文件浏览器源代码 (转) activity_main .xml <LinearLayout xmlns:android="http://schemas.android ...
- 使用JAVA写一个简单的日历
JAVA写一个简单的日历import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateF ...
- Java实现一个简单的网络爬虫
Java实现一个简单的网络爬虫 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWri ...
随机推荐
- git操作标签
操作标签 如果标签打错了,也可以删除: $ git tag -d v0.1 Deleted tag 'v0.1' (was e078af9) 因为创建的标签都只存储在本地,不会自动推送到远程.所以,打 ...
- Windows Azure 网站:应用程序字符串和连接字符串的工作原理
编辑人员注释:本文章由 Windows Azure 网站团队的首席项目经理 Stefan Schackow 撰写. Windows Azure 网站上有一个方便的功能,即开发人员可将 Azure 中的 ...
- [置顶] android利用jni调用第三方库——第二篇——编写库android程序直接调用第三方库libhello.so
0:前言 1:本文主要作为丙方android公司的身份来写 2:作者有不对的地方,请指出,谢谢 [第一篇:android利用jni调用第三方库——编写库libhello.so] [第二篇:androi ...
- Android版xx助手之天天酷跑外挂具体分析
Android版xx助手之天天酷跑外挂具体分析 图/文 莫灰灰 背景 近些年来,移动互联网的大肆崛起,潜移默化中影响着人们的生活和工作习惯.当腾讯的微信平台接入手机游戏之后,移动端的游戏也開 ...
- Ubuntu输入password登陆后又跳回到登录界面
现象:在Ubuntu登陆界面输入password之后.黑屏一闪而且出现了check battery state之类的文字之后,又跳转到登录界面. 原因:主文件夹下的.Xauthority文件拥有者变成 ...
- jQuery插件开发方法
jQuery如此流行,各式各样的jQuery插件也是满天飞.你有没有想过把自己的一些常用的JS功能也写成jQuery插件呢?如果你的答案是肯定的,那么来吧!和我一起学写jQuery插件吧! 很多公司的 ...
- Csharp多态的实现(接口)
1.什么是接口 接口可以看做是一个标准, 所有继承的子类需要按照接口中声明的方法来 接口用关键字 interface 修饰,接口的名字一般是I.........able ,表示我有什么能力 接口一般是 ...
- 兼容现有jQuery API的轻量级JavaScript库:Zepo
Zepo是一个JavaScript框架,其特点是兼容现有jQuery API的同时,自身体积十分小:它与jQuery有着类似的API.如果你会jQuery,那么也就会使用Zepto了. $('div' ...
- Aliyun EMR 集群重启
1.如果Core节点有Down掉,ActiveNodes少于Core节点数. 处理: a.登陆到Master节点,到目录 /opt/apps/hadoop-2.7.2/sbin b.执行 ./stop ...
- R包——ggplot2(一)
关于ggplot2包(一) 关于ggplot2包(一) ggplot2基本要素 数据(Data)和映射(Mapping) 几何对象(Geometric) 标尺(Scale) 统计变换(Statisti ...