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

📄 mainframe.java

📁 基于javazip的二进制发表发布版,也就是winzip的java版本
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
package org.jr.jzj;

/**
 * <p>Copyright: Copyright (c) 2002-2003</p>
 * <p>Company: JavaResearch(http://www.javaresearch.org)</p>
 * <p>最后更新日期:2003年3月4日
 * @author Cherami,Barney,Brain
 * @version 0.8
 */

import java.io.*;
import java.util.*;
import java.util.prefs.*;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;

import org.jr.io.*;
import org.jr.swing.*;
import org.jr.swing.filter.*;
import org.jr.swing.util.*;
import org.jr.text.*;
import org.jr.util.*;

/**
 * 系统的主界面类,完成界面的所有内容的构建。
 */
public class MainFrame
    extends JFrame {
  private static JZJLogger logger = new JZJLogger(MainFrame.class);
  Preferences preference = JZipJar.preference;
  JZJResources resource = JZJResources.getResources(); //系统所需的所有资源
  public File currentDirectory = new File(preference.get("current_directory",
      "."));
  FileSizeFormat formatter = new FileSizeFormat(true);
  Container contentPane;
  JMenuBar menubar;
  JToolBar toolbar;
  NewAction newAction;
  OpenAction openAction;
  CloseAction closeAction;
  ExitAction exitAction;
  AddAction addAction;
  DeleteAction deleteAction;
  ExtractAction extractAction;
  ViewAction viewAction;
  LookFeelAction[] lookFeelActions;
  OptionAction optionAction;
  AboutAction aboutAction;
  String[] lookfeelNames;
  JSplitPane splitPane;
  JScrollPane tablePane;
  JScrollPane treePane;
  JZJTree tree;
  JZJTable table;
  JPanel statusbar;
  JLabel totaInforlLabel;
  JLabel selectedInforLabel;
  ExtractDialog extractDialog;
  ViewFrame viewFrame;
  AboutDialog aboutDialog;
  OptionDialog optionDialog;
  JZJTableModel tableModel;
  JZJTreeModel treeModel;
  String frameTitle;
  String subTitle;
  JZJFile currentZipFile;
  Locale currentLocale = JZipJar.getSystemLocale();
  String tmpDirectory = preference.get("work_directory",
                                       System.getProperty("java.io.tmpdir", "."));
  String[] selectedInfor = new String[2];
  String[] totalInfor = new String[2];
  MemoryWatchPanel memoryPanel;
  RecentFilesManager recentFilesManager;

  JDynamicButton newButton;
  JDynamicButton closeButton;
  JDynamicButton addButton;
  JDynamicButton deleteButton;
  JDynamicButton openButton;
  JDynamicButton extractButton;
  JDynamicButton viewButton;
  JDynamicButton optionsButton;
  JDynamicButton aboutButton;
  JDynamicButton exitButton;
  ArrayList toolbarButtons = new ArrayList();

  JMenu fileMenu;
  JMenuItem newMenuItem;
  JMenuItem closeMenuItem;
  JMenuItem addMenuItem;
  JMenuItem deleteMenuItem;
  JMenuItem openMenuItem;
  JMenuItem extractMenuItem;
  JMenuItem viewMenuItem;
  JMenuItem aboutMenuItem;
  JMenuItem exitMenuItem;
  JMenuItem optionMenuItem;
  /**
   * 构造方法,完成界面所有元素的加载
   */
  public MainFrame() {
    init();
    createToolbar();
    createMenubar();
    createTable();
    createTree();
    createSplitPane();
    createStatusbar();
    setJMenuBar(menubar);
    contentPane.add(toolbar, "North");
    contentPane.add(splitPane, "Center");
    contentPane.add(statusbar, "South");
    disableThem();
    recentFilesManager = new RecentFilesManager(preference.getInt("recentfiles",
        8), fileMenu, true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }

  /**
   * 界面构成需要进行的所有初始化工作,主要是几个主要容器和Action的初始化。
   */
  private void init() {
    frameTitle = resource.getString("j_title");
    setTitle(frameTitle);
    contentPane = this.getContentPane();
    menubar = new JMenuBar();
    toolbar = new JToolBar();
    statusbar = new JPanel();
    newAction = new NewAction();
    openAction = new OpenAction();
    closeAction = new CloseAction();
    exitAction = new ExitAction();
    addAction = new AddAction();
    deleteAction = new DeleteAction();
    extractAction = new ExtractAction();
    viewAction = new ViewAction();
    optionAction = new OptionAction();
    aboutAction = new AboutAction();
    UIManager.LookAndFeelInfo[] lookfeels = UIManager.getInstalledLookAndFeels();
    lookFeelActions = new LookFeelAction[lookfeels.length];
    lookfeelNames = new String[lookfeels.length];
    for (int i = 0; i < lookfeels.length; i++) {
      lookfeelNames[i] = lookfeels[i].getName();
      String lookfeelClassName = lookfeels[i].getClassName();
      lookFeelActions[i] = new LookFeelAction(lookfeelClassName);
    }
    JZJFile.setWorkDirectory(tmpDirectory);
  }

  /**
   * 创建工具栏。
   */
  private void createToolbar() {
    newButton = createToolbarButton("b_new");
    newButton.addActionListener(newAction);
    openButton = createToolbarButton("b_open");
    openButton.addActionListener(openAction);
    extractButton = createToolbarButton("b_extract");
    extractButton.addActionListener(extractAction);
    addButton = createToolbarButton("b_add");
    addButton.addActionListener(addAction);
    deleteButton = createToolbarButton("b_delete");
    deleteButton.addActionListener(deleteAction);
    viewButton = createToolbarButton("b_view");
    viewButton.addActionListener(viewAction);
    closeButton = createToolbarButton("b_close");
    closeButton.addActionListener(closeAction);
    optionsButton = createToolbarButton("b_option");
    optionsButton.addActionListener(optionAction);
    aboutButton = createToolbarButton("b_about");
    aboutButton.addActionListener(aboutAction);
    exitButton = createToolbarButton("b_exit");
    exitButton.addActionListener(exitAction);
  }

  /**
   * 创建所有菜单项。
   */
  private void createMenubar() {
    JMenu menu;

    fileMenu = createTopMenu("m_file");
    fileMenu.setMnemonic(KeyEvent.VK_F);
    newMenuItem = SwingUtil.createMenuItem( (MenuItemProperty) resource.
                                           getObject("m_new"), fileMenu);
    newMenuItem.addActionListener(newAction);
    openMenuItem = SwingUtil.createMenuItem( (MenuItemProperty) resource.
                                            getObject("m_open"), fileMenu);
    openMenuItem.addActionListener(openAction);
    closeMenuItem = SwingUtil.createMenuItem( (MenuItemProperty) resource.
                                             getObject("m_close"), fileMenu);
    closeMenuItem.addActionListener(closeAction);
    fileMenu.addSeparator();
    exitMenuItem = SwingUtil.createMenuItem( (MenuItemProperty) resource.
                                            getObject("m_exit"), fileMenu);
    exitMenuItem.addActionListener(exitAction);

    menu = createTopMenu("m_actions");
    menu.setMnemonic(KeyEvent.VK_A);
    addMenuItem = SwingUtil.createMenuItem( (MenuItemProperty) resource.
                                           getObject("m_add"), menu);
    addMenuItem.addActionListener(addAction);
    deleteMenuItem = SwingUtil.createMenuItem( (MenuItemProperty) resource.
                                              getObject("m_delete"), menu);
    deleteMenuItem.addActionListener(deleteAction);
    extractMenuItem = SwingUtil.createMenuItem( (MenuItemProperty) resource.
                                               getObject("m_extract"), menu);
    extractMenuItem.addActionListener(extractAction);
    viewMenuItem = SwingUtil.createMenuItem( (MenuItemProperty) resource.
                                            getObject("m_view"), menu);
    viewMenuItem.addActionListener(viewAction);

    menu = createTopMenu("m_option");
    menu.setMnemonic(KeyEvent.VK_O);
    optionMenuItem = SwingUtil.createMenuItem( (MenuItemProperty) resource.
                                              getObject("m_o_option"), menu);
    optionMenuItem.addActionListener(optionAction);
    JMenu lookfeelMenu = SwingUtil.createMenu( (MenuProperty) resource.
                                              getObject("m_lookfeel"), menu);
    ButtonGroup lookfeelGroup = new ButtonGroup();
    JMenuItem menuItem;
    for (int i = 0; i < lookfeelNames.length; i++) {
      menuItem = new JRadioButtonMenuItem(lookfeelNames[i]);
      menuItem.setMnemonic(lookfeelNames[i].charAt(0));
      lookfeelMenu.add(menuItem);
      menuItem.addActionListener(lookFeelActions[i]);
      lookfeelGroup.add(menuItem);
    }

    menu = createTopMenu("m_help");
    menu.setMnemonic(KeyEvent.VK_H);
    aboutMenuItem = SwingUtil.createMenuItem( (MenuItemProperty) resource.
                                             getObject("m_about"), menu);
    aboutMenuItem.addActionListener(aboutAction);
  }

  private void createTree() {
    treeModel = new JZJTreeModel();
    tree = new JZJTree(treeModel, tableModel);
    treePane = new JScrollPane();
    treePane.getViewport().add(tree, null);
  }

  private void createSplitPane() {
    splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, treePane, tablePane);
  }

  /**
   * 创建显示压缩包内容的表格。
   */
  private void createTable() {
    tableModel = new JZJTableModel(resource.getStringArray("t_columnnames"));
    tableModel.setVisibleStatus(preference.getLong("table_status", 127));
    table = new JZJTable(tableModel);
    table.addHeaderListener();
    tablePane = new JScrollPane(table);
    table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    table.setHeader();
    ListSelectionModel listSelectionModel = table.getSelectionModel();
    listSelectionModel.addListSelectionListener(new ListSelectionListener() {
      public void valueChanged(ListSelectionEvent e) {
        setSelectedStatus(table.getSelectedEntryCount(),
                          table.getSelectedTotalSize());
      }
    });
  }

  /**
   * 创建状态栏。
   */
  private void createStatusbar() {
    totaInforlLabel = new JLabel();
    selectedInforLabel = new JLabel();
    memoryPanel = new MemoryWatchPanel(resource.getString("i_memory"));
    setStatus(0, 0, 0, 0);
    statusbar.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
    statusbar.setLayout(new GridLayout(1, 3));
    totaInforlLabel.setBorder(BorderFactory.createBevelBorder(BevelBorder.
        LOWERED));
    selectedInforLabel.setBorder(BorderFactory.createBevelBorder(BevelBorder.
        LOWERED));
    memoryPanel.setBorder(BorderFactory.createBevelBorder(BevelBorder.
        LOWERED));
    statusbar.add(selectedInforLabel);
    statusbar.add(totaInforlLabel);
    statusbar.add(memoryPanel);
  }

  /**
   * 创建工具栏的按钮。
   * @param key 按钮在资源中的主键
   * @return 根据主键及其信息创建的工具栏图像按钮
   */
  private JDynamicButton createToolbarButton(String key) {
    ButtonProperty buttonProperty;
    JDynamicButton button;
    buttonProperty = (ButtonProperty) resource.getObject(key);
    button = new JDynamicButton(buttonProperty.text,
                                new ImageIcon(MainFrame.class.
                                              getResource(buttonProperty.image)));
    button.setToolTipText(buttonProperty.tooltip);
    button.setVerticalTextPosition(AbstractButton.BOTTOM);
    button.setHorizontalTextPosition(AbstractButton.CENTER);
    toolbar.add(button);
    return button;
  }

  /**
   * 创建顶层主菜单。
   * @param key 主菜单在资源中的主键
   * @return 根据主键及其信息创建的主菜单
   */
  private JMenu createTopMenu(String key) {
    JMenu menu = SwingUtil.createMenu( (MenuProperty) resource.getObject(key), null);
    menubar.add(menu);
    return menu;
  }

  /**
   * 设置工具栏的那些在某些情况下不能使用的按钮的状态为可用。
   */
  private void enableThem() {
    closeButton.setEnabled(true);
    addButton.setEnabled(true);
    deleteButton.setEnabled(true);
    extractButton.setEnabled(true);
    viewButton.setEnabled(true);
    closeMenuItem.setEnabled(true);
    addMenuItem.setEnabled(true);
    deleteMenuItem.setEnabled(true);
    extractMenuItem.setEnabled(true);
    viewMenuItem.setEnabled(true);
  }

  /**
   * 设置工具栏的那些在某些情况下不能使用的按钮的状态为不可用。
   */
  private void disableThem() {
    closeButton.setEnabled(false);
    addButton.setEnabled(false);
    deleteButton.setEnabled(false);
    extractButton.setEnabled(false);
    viewButton.setEnabled(false);
    closeMenuItem.setEnabled(false);
    addMenuItem.setEnabled(false);
    deleteMenuItem.setEnabled(false);
    extractMenuItem.setEnabled(false);
    viewMenuItem.setEnabled(false);
  }

  /**
   * 清除表格中的所有信息。
   */
  private void removeAllRows() {
    tableModel.clear();
    treeModel.removeAll();
  }

  /**
   * 设置状态栏的信息。
   * @param selectedCount 选中的文件数
   * @param selectedSize 选中的文件的大小的总和
   * @param totalCount 总共的文件数
   * @param totalSize 总共的文件的大小的总和
   */
  protected void setStatus(int selectedCount, long selectedSize, int totalCount,
                           long totalSize) {
    setSelectedStatus(selectedCount, selectedSize);
    setTotalStatus(totalCount, totalSize);
  }

  /**
   * 设置状态栏的选中部分的信息。
   * @param selectedCount 选中的文件数
   * @param selectedSize 选中的文件的大小的总和
   */
  protected void setSelectedStatus(int selectedCount, long selectedSize) {
    selectedInfor[0] = String.valueOf(selectedCount);
    selectedInfor[1] = formatter.format(selectedSize);
    String selected = StringUtil.getReplaceString(resource.getString(
        "i_selected"), selectedInfor);
    selectedInforLabel.setText(selected);
  }

  /**
   * 设置状态栏的总体信息。
   * @param totalCount 总共的文件数
   * @param totalSize 总共的文件大小
   */
  protected void setTotalStatus(int totalCount, long totalSize) {
    totalInfor[0] = String.valueOf(totalCount);
    totalInfor[1] = formatter.format(totalSize);
    String total = StringUtil.getReplaceString(resource.getString("i_total"),
                                               totalInfor);
    totaInforlLabel.setText(total);
  }

  /**
   * 添加文件。
   */
  private void addFiles() {
    JFileChooser chooser = new JFileChooser();
    chooser.setCurrentDirectory(currentDirectory);
    chooser.setMultiSelectionEnabled(true);
    int r = chooser.showOpenDialog(this);
    if (r == JFileChooser.APPROVE_OPTION) {
      File[] selectedFiles = chooser.getSelectedFiles();
      File path = chooser.getCurrentDirectory();
      currentDirectory = path;
      ArrayList addedFiles = new ArrayList();
      for (int i = 0; i < selectedFiles.length; i++) {
        String fileName = selectedFiles[i].getName();
        if (currentZipFile.isContainEntry(fileName)) {
          int selection = JOptionPane.showConfirmDialog(this,
              resource.getString("i_file") + " " + fileName + " " +
              resource.getString("i_exist") + resource.getString("i_overwrite"),

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -