📄 hufpanel.java
字号:
package datas2;
import javax.swing.JPanel;
import com.borland.jbcl.layout.XYLayout;
import com.borland.jbcl.layout.*;
import java.awt.Color;
import javax.swing.JTextArea;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.BorderFactory;
import javax.swing.*;
import java.awt.Font;
import javax.swing.border.TitledBorder;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class hufPanel extends JPanel {
XYLayout xYLayout1 = new XYLayout();
JLabel jLabel1 = new JLabel();
JLabel jLabel2 = new JLabel();
JScrollPane jScrollPane1 = new JScrollPane();
JTextArea jTextArea1 = new JTextArea();
JButton jButton1 = new JButton();
JScrollPane jScrollPane2 = new JScrollPane();
JTextArea jTextArea2 = new JTextArea();
TitledBorder titledBorder1 = new TitledBorder("");
JLabel jLabel3 = new JLabel();
JTextField jTextField1 = new JTextField();
JButton jButton2 = new JButton();
JScrollPane jScrollPane3 = new JScrollPane();
JTextArea jTextArea3 = new JTextArea();
JButton jButton3 = new JButton();
JTextField jTextField2 = new JTextField();
//=================================================
char leftWay = '0';
char rightWay = '1';
HuffNode[] hf,temp;
int count = 0;
//==================================================
public hufPanel() {
try {
jbInit();
} catch (Exception exception) {
exception.printStackTrace();
}
}
private void jbInit() throws Exception {
this.setLayout(xYLayout1);
this.setBackground(Color.lightGray);
xYLayout1.setWidth(433);
xYLayout1.setHeight(530);
jLabel1.setFont(new java.awt.Font("隶书", Font.BOLD, 16));
jLabel1.setForeground(Color.blue);
jLabel1.setBorder(BorderFactory.createRaisedBevelBorder());
jLabel1.setHorizontalAlignment(SwingConstants.CENTER);
jLabel1.setHorizontalTextPosition(SwingConstants.CENTER);
jLabel1.setText("Huffman编码");
jLabel2.setFont(new java.awt.Font("宋体", Font.BOLD, 13));
jLabel2.setForeground(Color.blue);
jLabel2.setBorder(BorderFactory.createEtchedBorder());
jLabel2.setText("输入字符序列:");
jScrollPane1.setHorizontalScrollBarPolicy(JScrollPane.
HORIZONTAL_SCROLLBAR_ALWAYS);
jScrollPane1.setBorder(BorderFactory.createLineBorder(Color.black));
jTextArea1.setBackground(Color.lightGray);
jButton1.setFont(new java.awt.Font("宋体", Font.BOLD, 12));
jButton1.setForeground(Color.blue);
jButton1.setText("统计频率");
jButton1.addActionListener(new hufPanel_jButton1_actionAdapter(this));
jScrollPane2.setVerticalScrollBarPolicy(JScrollPane.
VERTICAL_SCROLLBAR_ALWAYS);
jScrollPane2.getViewport().setBackground(Color.lightGray);
jScrollPane2.setBorder(BorderFactory.createLineBorder(Color.black));
jTextArea2.setBackground(Color.lightGray);
jLabel3.setFont(new java.awt.Font("宋体", Font.BOLD, 13));
jLabel3.setForeground(Color.blue);
jLabel3.setBorder(BorderFactory.createEtchedBorder());
jLabel3.setText("输入编码字符:");
jButton2.setFont(new java.awt.Font("宋体", Font.BOLD, 13));
jButton2.setForeground(Color.blue);
jButton2.setToolTipText("");
jButton2.setText("查看结果");
jButton2.addActionListener(new hufPanel_jButton2_actionAdapter(this));
jScrollPane3.setHorizontalScrollBarPolicy(JScrollPane.
HORIZONTAL_SCROLLBAR_ALWAYS);
jScrollPane3.setBorder(BorderFactory.createLineBorder(Color.black));
jTextArea3.setBackground(Color.lightGray);
jTextField1.setBackground(Color.lightGray);
jButton3.setFont(new java.awt.Font("宋体", Font.BOLD, 13));
jButton3.setForeground(Color.blue);
jButton3.setText("解码结果");
jButton3.addActionListener(new hufPanel_jButton3_actionAdapter(this));
jTextField2.setBackground(Color.lightGray);
this.add(jLabel1, new XYConstraints(103, 0, 305, 41));
this.add(jLabel3, new XYConstraints(4, 374, 104, 34));
this.add(jTextField1, new XYConstraints(114, 374, 219, 34));
jScrollPane3.getViewport().add(jTextArea3);
this.add(jButton2, new XYConstraints(3, 425, 104, 35));
this.add(jScrollPane3, new XYConstraints(114, 425, 219, 35));
this.add(jButton1, new XYConstraints(4, 122, 104, 35));
this.add(jLabel2, new XYConstraints(4, 57, 104, 35));
this.add(jScrollPane1, new XYConstraints(113, 57, 377, 35));
this.add(jTextField2, new XYConstraints(114, 480, 219, 35));
this.add(jButton3, new XYConstraints(3, 480, 104, 35));
jScrollPane2.getViewport().add(jTextArea2);
jScrollPane1.getViewport().add(jTextArea1);
this.add(jScrollPane2, new XYConstraints(113, 122, 170, 232));
}
//=============================================================
public void buildTree(HuffNode[] h,int n)//建树 m n 代表什么
{
for(int i = 0, m = n; i < 2 * n - 2; i += 2, m ++)
{
mysort(h, i, m - 1);
h[m] = new HuffNode(h[i].weight() + h[i + 1].weight());
h[m].isLeaf = false;
h[m].lChild = h[i];
h[m].rChild = h[i + 1];
}
}
public void mysort(HuffNode[] a, int start, int end)
{
for(int i = start + 1; i <= end; i ++)
for(int j = i; (j > start) && (a[j].weight() < a[j - 1].weight()); j --)
swap(a, j, j -1);
}
public void swap(HuffNode[] a, int i, int j)
{
HuffNode temp = a[i];
a[i] = a[j];
a[j] = temp;
}
public void setLabel(HuffNode h)
{
if(!h.isLeaf)
{
h.lChild.label = '0';
h.lChild.label_Another = leftWay;
h.lChild.path = h.path + h.lChild.label;
h.rChild.label = '1';
h.lChild.label_Another = rightWay;
h.rChild.path = h.path + h.rChild.label;
setLabel(h.lChild);
setLabel(h.rChild);
}
}
public String code(String s, HuffNode[] h)
{
StringBuffer temp = new StringBuffer();//String temp = "";
for(int i = 0; i <s.length(); i ++)
{
for(int j = 0; j <h.length; j ++)
if(s.charAt(i)== h[j].ch)
{temp.append(h[j].path);
System.out.println(h[j].path);}//temp += h[j].path;
}
return temp.toString();
}
public String disCode(String s, HuffNode[] h)
{
StringBuffer temps_0 = new StringBuffer();
StringBuffer temps_1 = new StringBuffer();
for(int i = 0; i < s.length(); i ++)
{
temps_0.append(s.charAt(i));//temps_0 += String.valueOf(s.charAt(i));
for(int j = 0; j <h.length; j ++)
if((temps_0.toString().equals(h[j].path))&&(h[j].isLeaf))
{
temps_1.append(h[j].ch);//temps_1+=String.valueOf(h[j].ch);
System.out.println("aaaaa====="+h[j].ch);
temps_0= new StringBuffer();
}
}
return temps_1.toString();
}
//=====================================================================
public void jButton1_actionPerformed(ActionEvent e) {
jTextArea2.setText("");
jTextArea2.setTabSize(4);
jTextArea2.append("字母\t次数\t字符编码\n");
//jTextArea1.setText("");
String tongji = "";
tongji = jTextArea1.getText();
StringBuffer[] sb = new StringBuffer[26];
for (int i = 0; i < sb.length; i++) {
sb[i] = new StringBuffer();
}
for (int i = 0; i < tongji.length(); i++) {
char a = tongji.charAt(i);
switch (a) {
case 'a':
sb[0].append(tongji.charAt(i));
break;
case 'b':
sb[1].append(tongji.charAt(i));
break;
case 'c':
sb[2].append(tongji.charAt(i));
break;
case 'd':
sb[3].append(tongji.charAt(i));
break;
case 'e':
sb[4].append(tongji.charAt(i));
break;
case 'f':
sb[5].append(tongji.charAt(i));
break;
case 'g':
sb[6].append(tongji.charAt(i));
break;
case 'h':
sb[7].append(tongji.charAt(i));
break;
case 'i':
sb[8].append(tongji.charAt(i));
break;
case 'j':
sb[9].append(tongji.charAt(i));
break;
case 'k':
sb[10].append(tongji.charAt(i));
break;
case 'l':
sb[11].append(tongji.charAt(i));
break;
case 'm':
sb[12].append(tongji.charAt(i));
break;
case 'n':
sb[13].append(tongji.charAt(i));
break;
case 'o':
sb[14].append(tongji.charAt(i));
break;
case 'p':
sb[15].append(tongji.charAt(i));
break;
case 'q':
sb[16].append(tongji.charAt(i));
break;
case 'r':
sb[17].append(tongji.charAt(i));
break;
case 's':
sb[18].append(tongji.charAt(i));
break;
case 't':
sb[19].append(tongji.charAt(i));
break;
case 'u':
sb[20].append(tongji.charAt(i));
break;
case 'v':
sb[21].append(tongji.charAt(i));
break;
case 'w':
sb[22].append(tongji.charAt(i));
break;
case 'x':
sb[23].append(tongji.charAt(i));
break;
case 'y':
sb[24].append(tongji.charAt(i));
break;
case 'z':
sb[25].append(tongji.charAt(i));
break;
default:
break;
}
}
for (int i = 0; i < sb.length; i++) {
if (sb[i].length() != 0) {
count++;
}
}
//========================初始化==================
hf = new HuffNode[2 * count - 1];
int n = 0;
for (int i = 0; i < sb.length; i++) {
if (sb[i].length() != 0) {
hf[n] = new HuffNode(sb[i].charAt(0), sb[i].length());
n++;
}
}
buildTree(hf, count); //建树
setLabel(hf[hf.length - 1]); //设置路径
for (int i = 0; i < sb.length; i++) {
if (sb[i].length() != 0) {
char c = sb[i].charAt(0);
String result = code(String.valueOf(c),hf);
jTextArea2.append(String.valueOf(sb[i].charAt(0)) + "\t" +
sb[i].length() + "\t"+result+"\n");
}
}
temp = hf;
count=0;
}
public void jButton2_actionPerformed(ActionEvent e) {
String in = jTextField1.getText();
String out = code(in,temp);
out = out.trim();
jTextArea3.setText(out);
}
public void jButton3_actionPerformed(ActionEvent e) {
String dis = jTextArea3.getText();
System.out.println(dis);
String discode = disCode(dis,temp);
jTextField2.setText(discode);
}
}
class hufPanel_jButton3_actionAdapter implements ActionListener {
private hufPanel adaptee;
hufPanel_jButton3_actionAdapter(hufPanel adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jButton3_actionPerformed(e);
}
}
class hufPanel_jButton2_actionAdapter implements ActionListener {
private hufPanel adaptee;
hufPanel_jButton2_actionAdapter(hufPanel adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jButton2_actionPerformed(e);
}
}
class hufPanel_jButton1_actionAdapter implements ActionListener {
private hufPanel adaptee;
hufPanel_jButton1_actionAdapter(hufPanel adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jButton1_actionPerformed(e);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -