⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jzjtable.java

📁 模仿WINDOWS的WINZIP的一款软件
💻 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 + -