📄 jzjtable.java
字号:
package org.jr.jzj;
/**
* <p>Copyright: Copyright (c) 2002-2003</p>
* <p>Company: JavaResearch(http://www.javaresearch.org)</p>
* <p>最后更新日期:2003年1月9日
* @author Cherami,Barney,Brain
* @version 0.8
*/
import java.util.prefs.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import java.util.*;
import org.jr.swing.table.*;
/**
* 显示压缩包内容的表格。
*/
public class JZJTable
extends JTable {
private static JZJLogger logger = new JZJLogger(JZJTable.class);
TableColumnModel columnModel; //列模型
int selectedCount = 0; //选中行数
long selectedTotalSize = 0; //选中文件的总的大小
protected SortableColumnHeaderRenderer headerRenderer; //表格头渲染器
Preferences preference = JZipJar.preference;
private static final int[] preferredWidth = {
150, 60, 60, 30, 140, 50, 300};
JZJTableModel model;
/**
* 构造方法,完成表格的初始化以及各列的宽度的重新设置。
* @param model 表格模型
*/
public JZJTable(JZJTableModel model) {
super(model);
columnModel = getColumnModel();
this.model = model;
setDefaultRenderer(Long.class, new ReadableSizeCellRenderer(false, false));
setDefaultRenderer(Float.class, new PercentCellRenderer());
setDefaultRenderer(Date.class, new DateCellRenderer());
setShowGrid(preference.getBoolean("showgridline", true));
setRowSelectionAllowed(preference.getBoolean("fulllineselect", true));
resize();
}
/**
* 设置表格头部的渲染器。
* <p>由于表格本身是具有排序功能的,表格头应该显示排序列的状态,因此需要使用自定义的表格头渲染器
*/
public void setHeader() {
JTableHeader header = getTableHeader();
headerRenderer = new SortableColumnHeaderRenderer( (JZJTableModel) getModel(),
header.getDefaultRenderer());
int columnCount = columnModel.getColumnCount();
for (int i = 0; i < columnCount; i++) {
TableColumn column = columnModel.getColumn(i);
column.setHeaderRenderer(headerRenderer);
}
}
/**
* 设置表格头的事件监听器。
* <p>监听表格头的鼠标点击事件,只有在点击的表格头是有效的表格头并且点击一次时才进行排序,
* 否则清除排序状态。
*/
public void addHeaderListener() {
getTableHeader().addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent event) {
JTableHeader header = (JTableHeader) (event.getSource());
int column = header.columnAtPoint(event.getPoint());
initSelectedStatus();
if (event.getClickCount() == 1 && column != -1) {
if (column == model.getSortColumn()) {
model.sortByColumn(column, !model.getSortOrder());
}
else {
model.sortByColumn(column, true);
}
}
else {
model.clearSort();
}
}
});
}
/**
* 表格的内容发生变化时设置进行重新设置。
* <p>需要调用父类的tableChanged方法完成一般的功能,并且要将相关的选中信息清除掉。
* @param e 表格模型改变事件
*/
public void tableChanged(TableModelEvent e) {
super.tableChanged(e);
selectedCount = 0;
selectedCount = 0;
//resize();
}
/**
* 重新设置表格各列的相对宽度
*/
public void resize() {
if (columnModel == null) {
return;
}
for (int i = 0; i < model.getColumnCount(); i++) {
columnModel.getColumn(i).setPreferredWidth(preferredWidth[i]);
}
}
/**
* 得到指定行的项目名。
* <p>包括相对路径名和文件名
* @param row 查询的行号
* @return 指定行的项目名
*/
public String getEntryName(int row) {
return ( (JZJTableModel) getModel()).getEntryName(row);
}
/**
* 得到表格代表的压缩包中的总的项目数。
* @return 表格代表的压缩包中的总的项目数
*/
public int getEntryCount() {
return ( (JZJTableModel) getModel()).getRowCount();
}
/**
* 得到指定行的记录。
* @param row 查询的行号
* @return 指定行的记录
*/
public JZJFileRecord getEntry(int row) {
return ( (JZJTableModel) getModel()).getEntry(row);
}
/**
* 得到选中的总行数。
* @return 选中的总行数
*/
public int getSelectedEntryCount() {
return selectedCount;
}
/**
* 得到选中的所有项目代表的文件的总的大小。
* @return 选中的所有项目代表的文件的总的大小
*/
public long getSelectedTotalSize() {
return selectedTotalSize;
}
/**
* 得到指定行所代表的文件的文件大小。
* @param row 查询的行号
* @return 指定行所代表的文件的文件大小
*/
public long getSelectedSize(int row) {
return ( (JZJTableModel) getModel()).getEntrySize(row);
}
/**
* 选中状态发生变化时的处理。
* <p>重新计算选中的总行数和总的大小
* @param e 选中事件
*/
public void valueChanged(ListSelectionEvent e) {
super.valueChanged(e);
int[] rows = getSelectedRows();
selectedCount = rows.length;
selectedTotalSize = 0;
for (int i = 0; i < rows.length; i++) {
selectedTotalSize = selectedTotalSize + getSelectedSize(rows[i]);
}
}
/**
* 初始化选中状态为0。
*/
protected void initSelectedStatus() {
selectedCount = 0;
selectedTotalSize = 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -