📄 frame1.java
字号:
package hanio;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2005</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/
public class Frame1 extends JFrame implements Runnable {
JPanel contentPane;
JButton jButton1 = new JButton();
//Construct the frame
public Frame1() {
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
try {
jbInit();
}
catch (Exception e) {
e.printStackTrace();
}
}
//Component initialization
private void jbInit() throws Exception {
contentPane = (JPanel)this.getContentPane();
jButton1.setBackground(new Color(255, 255, 250));
jButton1.setBounds(new Rectangle(181, 366, 105, 26));
jButton1.setFont(new java.awt.Font("Dialog", 0, 12));
jButton1.setForeground(new Color(122, 150, 225));
jButton1.setText("确定");
jButton1.addActionListener(new Frame1_jButton1_actionAdapter(this));
contentPane.setLayout(null);
this.getContentPane().setBackground(SystemColor.info);
this.setForeground(Color.red);
this.setIconImage(null);
this.setSize(new Dimension(841, 528));
this.setTitle(" 汉诺塔 软件工程(2)班 刘勋华 22");
jTextArea1.setEnabled(true);
jTextArea1.setForeground(new Color(122, 150, 222));
jTextArea1.setBorder(BorderFactory.createEtchedBorder());
jTextArea1.setOpaque(true);
jTextArea1.setRequestFocusEnabled(false);
jTextArea1.setDisabledTextColor(new Color(122, 150, 222));
jTextArea1.setColumns(1200);
jTextArea1.setLineWrap(true);
jTextArea1.setRows(1200);
jTextArea1.setWrapStyleWord(true);
contentPane.addMouseListener(new Frame1_contentPane_mouseAdapter(this));
jLabel1.setEnabled(true);
jLabel1.setFont(new java.awt.Font("Dialog", 0, 13));
jLabel1.setForeground(SystemColor.textHighlight);
jLabel1.setText("输入盘数:[1,10]");
jLabel1.setBounds(new Rectangle(32, 366, 90, 26));
jOptionPane1.setBackground(new Color(255, 255, 225));
jOptionPane1.setToolTipText("");
jOptionPane1.setBounds(new Rectangle(282, 503, 187, 70));
jButton2.setBackground(new Color(255, 255, 250));
jButton2.setBounds(new Rectangle(416, 366, 109, 26));
jButton2.setFont(new java.awt.Font("Dialog", 0, 12));
jButton2.setForeground(new Color(122, 150, 225));
jButton2.setText("动画演示");
jButton2.addActionListener(new Frame1_jButton2_actionAdapter(this));
jButton3.setBackground(new Color(255, 255, 250));
jButton3.setBounds(new Rectangle(536, 366, 106, 26));
jButton3.setFont(new java.awt.Font("Dialog", 0, 12));
jButton3.setForeground(new Color(122, 150, 225));
jButton3.setText("文本显示");
jButton3.addActionListener(new Frame1_jButton3_actionAdapter(this));
jButton4.setBackground(new Color(255, 255, 250));
jButton4.setBounds(new Rectangle(180, 398, 106, 26));
jButton4.setFont(new java.awt.Font("Dialog", 0, 12));
jButton4.setForeground(new Color(122, 150, 225));
jButton4.setText("清空重置");
jButton4.addActionListener(new Frame1_jButton4_actionAdapter(this));
jButton5.setBackground(new Color(255, 255, 250));
jButton5.setBounds(new Rectangle(294, 366, 112, 27));
jButton5.setFont(new java.awt.Font("Dialog", 0, 12));
jButton5.setForeground(new Color(122, 150, 225));
jButton5.setText("手工操作");
jButton5.addActionListener(new Frame1_jButton5_actionAdapter(this));
jTextArea2.setBorder(BorderFactory.createEtchedBorder());
jTextArea2.setBounds(new Rectangle(130, 366, 40, 26));
jScrollPane1.setBounds(new Rectangle(668, 44, 133, 348));
jLabel2.setFont(new java.awt.Font("Dialog", 0, 12));
jLabel2.setForeground(SystemColor.inactiveCaption);
jLabel2.setText("步数:");
jLabel2.setBounds(new Rectangle(322, 398, 39, 27));
jLabel3.setFont(new java.awt.Font("Dialog", 1, 16));
jLabel3.setForeground(Color.red);
jLabel3.setText("0");
jLabel3.setBounds(new Rectangle(364, 397, 30, 27));
jLabel4.setFont(new java.awt.Font("Dialog", 0, 12));
jLabel4.setForeground(Color.red);
jLabel4.setBounds(new Rectangle(34, 399, 146, 27));
contentPane.setMaximumSize(new Dimension(808, 412));
contentPane.setMinimumSize(new Dimension(808, 412));
contentPane.addMouseMotionListener(new Frame1_contentPane_mouseMotionAdapter(this));
jButton7.setBackground(new Color(255, 255, 250));
jButton7.setBounds(new Rectangle(416, 397, 109, 26));
jButton7.setFont(new java.awt.Font("Dialog", 0, 12));
jButton7.setForeground(new Color(122, 150, 225));
jButton7.setText("动画暂停");
jButton7.addActionListener(new Frame1_jButton7_actionAdapter(this));
contentPane.add(jOptionPane1, null);
contentPane.add(jButton2, null);
contentPane.add(jButton5, null);
contentPane.add(jButton3, null);
contentPane.add(jButton1, null);
contentPane.add(jButton4, null);
contentPane.add(jTextArea2, null);
contentPane.add(jLabel1, null);
contentPane.add(jLabel4, null);
contentPane.add(jScrollPane1, null);
contentPane.add(jButton7, null);
contentPane.add(jLabel2, null);
contentPane.add(jLabel3, null);
jScrollPane1.getViewport().add(jTextArea1, null);
}
//Overridden so we can exit when window is closed
protected void processWindowEvent(WindowEvent e) {
super.processWindowEvent(e);
if (e.getID() == WindowEvent.WINDOW_CLOSING) {
System.exit(0);
}
}
Color color;
int n =0;//表示画笔的所画内容
int disnum; //盘子总数
int Adishremain=0, Bdishremain=0, Cdishremain=0;
int step=0;String S;//计步数
int i = 1;
int TowS,TowD;//TowS表示来源塔,TowD表示目标塔,=1表示塔A,=2表示塔B,=3表示塔C
int[] TowA = new int[11];
int[] TowB = new int[11];
int[] TowC = new int[11];
int[] Number=new int[11];
int Ax[]={95,115,105};
int Ay[]={90,90,110};
int Bx[]={315,335,325};
int By[]={90,90,110};
int Cx[]={535,555,545};
int Cy[]={90,90,110};
int from=0;//1表示盘来自A塔,2表示盘来自B塔,3表示盘来自C塔
int fromX=0;//来源塔的X坐标值
int num=1;
int stepcount=0;//记录动画演示过程的步数
int x, y; //释放点的坐标
int movX, movY, movW, movH;//记录要移动的盘子的坐标,长度,和高度
int TowX, TowY;//记录要移动的盘子在塔的位置坐标
boolean canmove = false;//表示能否移盘
boolean ok=true,move=false,text=false,clean=false,hand=false,wait=false,
suspend=false,MOV=false,HAND=false;
String s;
String c;
String number;
String STEP;
private Thread animate= null ;//做动画的线程
JTextArea jTextArea1 = new JTextArea();
JLabel jLabel1 = new JLabel();
ButtonGroup buttonGroup1 = new ButtonGroup();
JOptionPane jOptionPane1 = new JOptionPane();
JButton jButton2 = new JButton();
JButton jButton3 = new JButton();
JButton jButton4 = new JButton();
JButton jButton5 = new JButton();
JTextArea jTextArea2 = new JTextArea();
JScrollPane jScrollPane1 = new JScrollPane();
JLabel jLabel2 = new JLabel();
JLabel jLabel3 = new JLabel();
JLabel jLabel4 = new JLabel();
JButton jButton7 = new JButton();
public void update(Graphics g) {
paint(g);
}
public void paint(Graphics g) {
switch (n) {
case 0://画塔和底座
jTextArea2.requestFocusInWindow();
super.paint(g);
color = new Color(122, 150, 223);
g.setColor(color);
g.fill3DRect(100, 130, 10, 200,true);
g.fill3DRect(320, 130, 10, 200,true);
g.fill3DRect(540, 130, 10, 200,true);
g.fill3DRect(50, 330, 110, 20,true);
g.fill3DRect(270, 330, 110, 20,true);
g.fill3DRect(490, 330, 110, 20,true);
color = new Color(0, 0, 0);
g.setColor(color);
g.drawString("TowerA",84,343);
g.drawString("TowerB",304,343);
g.drawString("TowerC",524,343);
break;
case 1: //画全部盘子
for (i = 1; i <= disnum; i++) {
color = new Color(255, 0, 0);
g.setColor(color);
g.fill3DRect((210-TowA[i])/2, 330 - 15 * i, TowA[i],10,true);
number=number.valueOf(disnum+1-i);
color = new Color(0, 0, 0);
g.setColor(color);
g.drawString(number,(2*(210-TowA[i])/2+TowA[i])/2-2,330 - 15 * i+9);}
break;
case 2: //A塔消盘
color = new Color(255, 255, 225);
g.setColor(color);
g.fillRect(movX, movY, 100, 10);
color = new Color(122, 150, 223);
g.setColor(color);
g.fill3DRect(100,130,10,TowY-130+15,true);
color = new Color(255, 0, 0);
g.setColor(color);
g.fill3DRect(movX,110,movW,10,true);
color = new Color(0, 0, 0);
g.setColor(color);
g.drawString(number,(2*(210 - movW) / 2+movW)/2-2,110+10);
break;
case 3: //在B塔画盘
color = new Color(255, 255, 225);
g.setColor(color);
g.fillRect(0, 110, 650, 10);
color = new Color(255, 0, 0);
g.setColor(color);
g.fill3DRect( (650 - movW) / 2, 330 - 15 * (Bdishremain), movW, 10,true);
color = new Color(0, 0, 0);
g.setColor(color);
g.drawString(number,(2*(650 - movW) / 2+movW)/2-2,330 - 15 * (Bdishremain)+9);
break;
case 4: //在C塔画盘
color = new Color(255, 255, 225);
g.setColor(color);
g.fillRect(0, 110, 650, 10);
color = new Color(255, 0, 0);
g.setColor(color);
g.fill3DRect( (1090 - movW) / 2, 330 - 15 * (Cdishremain), movW, 10,true);
color = new Color(0, 0, 0);
g.setColor(color);
g.drawString(number,(2*(1090 - movW) / 2+movW)/2-2,330 - 15 * (Cdishremain)+9);
break;
case 5: //B塔消盘
color = new Color(255, 255, 225);
g.setColor(color);
g.fillRect(movX, movY, 100, 10);
color = new Color(122, 150, 223);
g.setColor(color);
g.fill3DRect(320,130,10,TowY-130+15,true);
color = new Color(255, 0, 0);
g.setColor(color);
g.fill3DRect(movX,110,movW,10,true);
color = new Color(0, 0, 0);
g.setColor(color);
g.drawString(number,(2*(650 - movW) / 2+movW)/2-2,110+10);
break;
case 6: //C塔消盘
color = new Color(255, 255, 225);
g.setColor(color);
g.fillRect(movX, movY, 100, 10);
color = new Color(122, 150, 223);
g.setColor(color);
g.fill3DRect(540,130,10,TowY-130+15,true);
color = new Color(255, 0, 0);
g.setColor(color);
g.fill3DRect(movX,110,movW,10,true);
color = new Color(0, 0, 0);
g.setColor(color);
g.drawString(number,(2*(1090 - movW) / 2+movW)/2-2,110+10);
break;
case 7: //在A塔画盘
color = new Color(255, 255, 225);
g.setColor(color);
g.fillRect(0, 110, 650, 10);
color = new Color(255, 0, 0);
g.setColor(color);
g.fill3DRect((210 - movW) / 2, 330 - 15 * (Adishremain), movW, 10,true);
color = new Color(0, 0, 0);
g.setColor(color);
g.drawString(number,(2*(210 - movW) / 2+movW)/2-2,330 - 15 * (Adishremain)+9);
break;
case 8://回画
color = new Color(255, 255, 225);
g.setColor(color);
g.fillRect(0, 110, 650, 10);
color = new Color(255, 0, 0);
g.setColor(color);
g.fill3DRect(movX, movY, movW, 10,true);
color = new Color(0, 0, 0);
g.setColor(color);
g.drawString(number,(2*(fromX - movW) / 2+movW)/2-2,movY+9);
break;
case 9://A塔箭头
g.fillRect(100,60,10,30);
g.fillPolygon(Ax,Ay,3);
break;
case 10://B塔画箭头
g.fillRect(320,60,10,30);
g.fillPolygon(Bx,By,3);
break;
case 11://C塔画箭头
g.fillRect(540,60,10,30);
g.fillPolygon(Cx,Cy,3);
break;
case 12://清除箭头
color = new Color(255, 255, 225);
g.setColor(color);
g.fillRect(50,60,600,50);
break;
}
}
void jButton1_actionPerformed(ActionEvent e) {
if(ok){
jLabel4.setText("");
String s;
s=jTextArea2.getText();
int Ascii=s.hashCode();
if(!((Ascii>48&&Ascii<58)||Ascii==1567)){jLabel4.setText("请输入1~10之间的数字");jTextArea2.setText("");ok=true;return;}
ok=false;
move=true;text=true;clean=true;suspend=false;MOV=true;HAND=true;//按确定之后其它按钮才有效
int m = 1, j =100;
for (m = 0; m <= 10; m++)
{TowA[m] =0;TowB[m] =0;TowC[m] =0;}
disnum = (int)(Double.parseDouble(jTextArea2.getText()));
if(disnum>10||disnum<1){jTextArea2.setText("");jLabel4.setText("请输入1~10之间的数字");ok=true;return;}
Adishremain = disnum;
Bdishremain = 0;
Cdishremain = 0;
hand=false;
for (m = 1; m <= disnum; m++) {
TowA[m] = j;
Number[(100-j)/8+1]=disnum+1-m;
j = j -8;
} //TowA[num]位于最顶
j = 100;
for (m = 1; m <= disnum; m++) {
TowB[m] = j;}
for (m = 1; m <= disnum; m++) {
TowC[m] = j;}
n = 1;
repaint();}
else{jLabel4.setText("请先按“清空重置”");}
}
void contentPane_mousePressed(MouseEvent e) {//按下鼠标
if(hand){
x = e.getX();
y = e.getY();
if ( (x >= 50) && (x <= 160) )
{ //A塔取盘
if (Adishremain == 0)
return;
else {
from=1;
movX = (210 - TowA[Adishremain]) / 2;
movY = 330 - 15 * (Adishremain);
movW = TowA[Adishremain];
movH = 10;
number=number.valueOf( Number[(100-movW)/8+1]);
TowX = 100;
TowY = 330 - 15 * (Adishremain);
Adishremain--; //
canmove = true;
n = 2;
repaint();}
}
if ( (x >= 270) && (x <= 380))
{ //B塔取盘
if (Bdishremain == 0)
return;
else {
from=2;
movX = (650 - TowB[Bdishremain]) / 2;
movY = 330 - 15 * (Bdishremain);
movW = TowB[Bdishremain];
movH = 10;
number=number.valueOf( Number[(100-movW)/8+1]);
TowX = 320;
TowY = 330 - 15 * (Bdishremain);
Bdishremain--;
canmove = true;
n = 5;
repaint();}
}
if ( (x >= 490 ) && (x <= 600) )
{ //C塔取盘
if (Cdishremain == 0)
return;
else {
from=3;
movX = (1090 - TowC[Cdishremain]) / 2;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -