📄 main.java
字号:
package hfmCompress;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Color;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.FileDialog;
import javax.swing.border.BevelBorder;
public class Main extends JFrame implements ActionListener, Runnable {
private final int WIDTH = 400, HEIGHT = 200;
private Toolkit kit = null;
private int screenWidth = 0, screenHeight = 0;
private Dimension screenSize = null;
private JLabel[] compressLabel = new JLabel[4];
private JTextField[] compressTextField = new JTextField[4];
private JButton[] compressButton = new JButton[4];
private JButton startButton = new JButton("确定");
private JButton resetButton = new JButton("重置");
private JButton quitButton = new JButton("退出");
private String[] labelText = { "压缩文件: ", "压缩路径:", "解压文件:", "解压路径:" };
private Font f = new Font("", Font.BOLD, 15);
private static Main mainWindow = null;
private boolean compress = true;
private Compress compressFile = null, deCompressFile = null;
private String sourceFolderName = null, destinationFolderName = null,
sFileName = null, dFileName = null;
private static Process compressProcess = null, deCompressProcess = null;
public Main() {
super("数据结构实验二——文件压缩");
this.setSize(WIDTH, HEIGHT);
kit = Toolkit.getDefaultToolkit();
screenSize = kit.getScreenSize();
screenWidth = screenSize.width;
screenHeight = screenSize.height;
setLocation((screenWidth - WIDTH) / 2,
(screenHeight - HEIGHT) / 2);
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent event) {
if (JOptionPane.showConfirmDialog(null, "是否真的要退出?", "文件压缩",
JOptionPane.YES_NO_CANCEL_OPTION) == JOptionPane.YES_OPTION) {
System.exit(0);
}
}
});
Container content = this.getContentPane();
content.setLayout(new FlowLayout());
for (int i = 0; i < 4; i++) {
compressLabel[i] = new JLabel(labelText[i]);
compressLabel[i].setFont(f);
compressLabel[i].setForeground(Color.CYAN.darker());
compressTextField[i] = new JTextField(20);
compressTextField[i].setFont(f);
compressButton[i] = new JButton("浏览");
compressButton[i].setFont(f);
compressButton[i].setForeground(Color.BLUE);
compressButton[i].setBorder(new BevelBorder(BevelBorder.RAISED));
compressButton[i].addActionListener(this);
compressButton[i].addMouseListener(new MouseWatcher());
content.add(compressLabel[i]);
content.add(compressTextField[i]);
content.add(compressButton[i]);
if (i % 2 == 1) {
compressTextField[i].setEditable(false);
compressButton[i].setEnabled(false);
}
}
startButton.setFont(f);
startButton.setBorder(new BevelBorder(BevelBorder.RAISED));
startButton.addActionListener(this);
startButton.addMouseListener(new MouseWatcher());
startButton.setEnabled(false);
resetButton.setFont(f);
resetButton.setBorder(new BevelBorder(BevelBorder.RAISED));
resetButton.addActionListener(this);
resetButton.addMouseListener(new MouseWatcher());
quitButton.setFont(f);
quitButton.setBorder(new BevelBorder(BevelBorder.RAISED));
quitButton.addActionListener(this);
quitButton.addMouseListener(new MouseWatcher());
content.add(startButton);
content.add(resetButton);
content.add(quitButton);
content.setBackground(Color.BLACK);
this.setResizable(false);
}
public void actionPerformed(ActionEvent ae) {
if (!(ae.getSource() instanceof JButton)) {
return;
}
JButton jb = (JButton) ae.getSource();
if (jb == compressButton[0] || jb == compressButton[2]) {
FileDialog fileChooser = new FileDialog(mainWindow, "选择压缩文件",
FileDialog.LOAD);
fileChooser.setVisible(true);
sFileName = fileChooser.getFile();
sourceFolderName = fileChooser.getDirectory();
if (sFileName == null || sourceFolderName == null) {
return;
}
if (jb == compressButton[0]) {
compress = true;
compressButton[1].setEnabled(true);
compressTextField[1].setEditable(true);
compressButton[2].setEnabled(false);
compressTextField[2].setEditable(false);
compressTextField[0].setText(sourceFolderName + sFileName);
} else {
compress = false;
compressButton[0].setEnabled(false);
compressTextField[0].setEditable(false);
compressButton[3].setEnabled(true);
compressTextField[3].setEditable(true);
compressTextField[2].setText(sourceFolderName + sFileName);
}
} else if (jb == compressButton[1] || jb == compressButton[3]) {
FileDialog fileSaver = new FileDialog(mainWindow, "选择文件路径",
FileDialog.SAVE);
fileSaver.setVisible(true);
if (dFileName == null || destinationFolderName == null) {
return;
}
if (jb == compressButton[1]) {
compressTextField[1].setEditable(true);
compressTextField[1].setText(destinationFolderName + dFileName);
} else {
compressTextField[3].setEditable(true);
compressTextField[3].setText(destinationFolderName + dFileName);
}
startButton.setEnabled(true);
} else if (jb == startButton) {
if (compress) {
compressProcess = new Process();
compressProcess.setVisible(true);
compressProcess.setTitle("正在压缩……");
Thread processThread = new Thread(compressProcess);
processThread.start();
Thread mainThread = new Thread(this);
mainThread.start();
} else {
deCompressProcess = new Process();
deCompressProcess.setTitle("正在解压……");
Thread processThread = new Thread(deCompressProcess);
processThread.start();
Thread mainThread = new Thread(this);
mainThread.start();
}
startButton.setEnabled(false);
} else if (jb == resetButton) {
compressTextField[0].setEditable(true);
compressButton[0].setEnabled(true);
compressTextField[0].setText("");
compressTextField[1].setEditable(false);
compressButton[1].setEnabled(false);
compressTextField[1].setText("");
compressTextField[2].setEditable(true);
compressButton[2].setEnabled(true);
compressTextField[2].setText("");
compressTextField[3].setEditable(false);
compressButton[3].setEnabled(false);
compressTextField[3].setText("");
} else if (jb == quitButton) {
if (JOptionPane.showConfirmDialog(null, "是否真的要退出?", "文件压缩",
JOptionPane.YES_NO_CANCEL_OPTION) == JOptionPane.YES_OPTION) {
System.exit(0);
}
}
}
public static void showProcess(){
deCompressProcess.setVisible(true);
}
public void run() {
try {
if (compress) {
compressFile = new Compress();
Thread.sleep(100);
compressFile.readAndSort(sourceFolderName + sFileName);
Process.setCompressTrue(15,"正在创建最小堆……");
Thread.sleep(200);
compressFile.creatMinHeap();
Process.setCompressTrue(20,"正在获得字节编码……");
Thread.sleep(200);
compressFile.calBytesAndLastBits();
Process.setCompressTrue(25,"正在创建压缩文件……");
Thread.sleep(200);
compressFile.writeCode(destinationFolderName, dFileName,
sourceFolderName, sFileName);
Process.setCompressTrue(100,"正在结束压缩……");
Thread.sleep(200);
compressProcess.dispose();
JOptionPane.showMessageDialog(null, "^_^ 压缩完毕!", "文件压缩",
JOptionPane.INFORMATION_MESSAGE);
} else {
deCompressFile = new Compress();
deCompressFile.deCompress(destinationFolderName, dFileName,
sourceFolderName, sFileName);
Process.setCompressTrue(100,"正在结束解压……");
Thread.sleep(200);
deCompressProcess.dispose();
JOptionPane.showMessageDialog(null, "^_^ 解压完毕!", "文件压缩",
JOptionPane.INFORMATION_MESSAGE);
}
} catch (Exception a) {
}
}
private class MouseWatcher extends MouseAdapter {
public void mousePressed(MouseEvent me) {
((JButton) me.getSource()).setBorder(new BevelBorder(
BevelBorder.LOWERED));
}
public void mouseReleased(MouseEvent me) {
((JButton) me.getSource()).setBorder(new BevelBorder(
BevelBorder.RAISED));
}
}
public static void main(String[] args) {
mainWindow = new Main();
mainWindow.setVisible(true);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -