📄 showhanoiframe.java~3~
字号:
package TowersOfHanoi;
import java.io.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.border.*;
//主界面
public class ShowHanoiFrame extends JFrame implements MouseListener{
Container cp;
JMenuBar menuBar;
JToolBar bar;
JLabel newLabel;
JLabel openLabel;
JLabel saveLabel;
JLabel startLabel;
JLabel pauseLabel;
JLabel stopLabel;
JLabel setupLabel;
JLabel messageLabel;
//Thread thread;
private HannoiTowerPanel tower = null;
char towerName[] = {'A','B','C'};
private int numDisks=4;
private int speed=10;
public ShowHanoiFrame() {
super("汉诺塔演示界面");
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {}
tower = new HannoiTowerPanel(numDisks,towerName,speed,Integer.MIN_VALUE);
setSize(480, 400);
setLocation(250, 150);
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
if (JOptionPane.showConfirmDialog(null, "确定退出汉诺塔演示界面?", "确认退出",
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.WARNING_MESSAGE) ==
JOptionPane.OK_OPTION) {
System.exit( -1);
}
}
});
init();
setJMenuBar(menuBar);
cp = getContentPane();
cp.add(tower,BorderLayout.CENTER);
cp.add(bar, BorderLayout.NORTH);
setResizable(false);
validate();
setVisible(true);
}
public void init() {
//构造menuBar
//构造文件fileMenu
JMenu fileMenu = new JMenu("文件");
JMenuItem newFileItem = new JMenuItem("新建");
newFileItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,
KeyEvent.CTRL_MASK, false));
JMenuItem openItem = new JMenuItem("打开");
openItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,
KeyEvent.CTRL_MASK, false));
JMenuItem saveItem = new JMenuItem("保存");
saveItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,
KeyEvent.CTRL_MASK, false));
JMenuItem exitItem = new JMenuItem("退出");
exitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E,
KeyEvent.CTRL_MASK, false));
newFileItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
stop();
}
});
openItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
String fileName = openFile();
if (fileName != null) {
FileInputStream fis = new FileInputStream(fileName);
ObjectInputStream ois = new ObjectInputStream(fis);
HannoiTowerPanel hannoi = (HannoiTowerPanel) ois.
readObject();
ois.close();
tower.setMyThreadStop();
ShowHanoiFrame.this.remove(tower);
tower = new HannoiTowerPanel(hannoi.getNumDisks(),
towerName, 0,
hannoi.getThreadState());
tower.getMyThread().start();
cp.add(tower, BorderLayout.CENTER);
validate();
}
} catch (Exception ee) {
ee.printStackTrace();
}
}
});
saveItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
String fileName = saveFile();
if (fileName != null) {
FileOutputStream fos = new FileOutputStream(fileName+".dat");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(tower);
oos.flush();
fos.close();
}
} catch (Exception ee) {}
}
});
exitItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit( -1);
}
});
fileMenu.add(newFileItem);
fileMenu.add(openItem);
fileMenu.add(saveItem);
fileMenu.add(new JSeparator(JSeparator.HORIZONTAL));
fileMenu.add(exitItem);
//构造文件operateMenu
JMenu operateMenu = new JMenu("操作");
JMenuItem startItem = new JMenuItem("开始");
startItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R,
KeyEvent.CTRL_MASK, false));
JMenuItem pauseItem = new JMenuItem("暂停");
pauseItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P,
KeyEvent.CTRL_MASK, false));
JMenuItem stopItem = new JMenuItem("停止");
stopItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B,
KeyEvent.CTRL_MASK, false));
JMenuItem setupItem = new JMenuItem("设置");
setupItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,
KeyEvent.CTRL_MASK, false));
startItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (tower.getMyThread().isAlive()) {
synchronized (tower.getMyThread()) {
tower.setLimitState(Integer.MIN_VALUE);
tower.setSpeed(speed);
tower.setPause(false);
tower.getMyThread().notify();
}
}else{
play();
}
}
});
pauseItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
pauseThread();
}
});
stopItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
stop();
}
});
setupItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new SetupWindow(ShowHanoiFrame.this);
}
});
operateMenu.add(startItem);
operateMenu.add(pauseItem);
operateMenu.add(stopItem);
operateMenu.add(new JSeparator(JSeparator.HORIZONTAL));
operateMenu.add(setupItem);
//构造文件helpMenu
JMenu helpMenu = new JMenu("帮助");
JMenuItem aboutItem = new JMenuItem("关于(A)");
aboutItem.setMnemonic(KeyEvent.VK_A);
aboutItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showConfirmDialog(ShowHanoiFrame.this, "土木水利学院 水力学及河流动力学专业 \n 作者:王艳君-20706162", "作者信息",
JOptionPane.CLOSED_OPTION,JOptionPane.INFORMATION_MESSAGE);
}
});
helpMenu.add(aboutItem);
//构造menuBar
menuBar = new JMenuBar();
menuBar.add(fileMenu);
menuBar.add(operateMenu);
menuBar.add(helpMenu);
//构造工具栏
bar = new JToolBar();
Color barColor = bar.getBackground();
bar.setBorder(BorderFactory.createEtchedBorder());
bar.setFloatable(false);
bar.setLayout(new BoxLayout(bar, BoxLayout.X_AXIS));
newLabel = new JLabel(new ImageIcon(getClass().getResource(
"face/new.gif")));
newLabel.setBorder(BorderFactory.createEmptyBorder(3,3,3,3));
newLabel.setToolTipText("新建");
newLabel.setBackground(barColor);
newLabel.addMouseListener(this);
openLabel = new JLabel(new ImageIcon(getClass().getResource(
"face/open.gif")));
openLabel.setBorder(BorderFactory.createEmptyBorder(3,3,3,3));
openLabel.setToolTipText("打开");
openLabel.setBackground(barColor);
openLabel.addMouseListener(this);
saveLabel = new JLabel(new ImageIcon(getClass().getResource(
"face/save.gif")));
saveLabel.setBorder(BorderFactory.createEmptyBorder(3,3,3,3));
saveLabel.setToolTipText("保存");
saveLabel.setBackground(barColor);
saveLabel.addMouseListener(this);
startLabel = new JLabel(new ImageIcon(getClass().getResource(
"face/play.gif")));
startLabel.setBorder(BorderFactory.createEmptyBorder(3,3,3,3));
startLabel.setToolTipText("开始");
startLabel.setBackground(barColor);
startLabel.addMouseListener(this);
pauseLabel = new JLabel(new ImageIcon(getClass().getResource(
"face/pause.gif")));
pauseLabel.setBorder(BorderFactory.createEmptyBorder(3,3,3,3));
pauseLabel.setToolTipText("暂停");
pauseLabel.setBackground(barColor);
pauseLabel.addMouseListener(this);
stopLabel = new JLabel(new ImageIcon(getClass().getResource(
"face/stop.gif")));
stopLabel.setBorder(BorderFactory.createEmptyBorder(3,3,3,3));
stopLabel.setToolTipText("停止");
stopLabel.setBackground(barColor);
stopLabel.addMouseListener(this);
setupLabel = new JLabel(new ImageIcon(getClass().getResource(
"face/setup.gif")));
setupLabel.setBorder(BorderFactory.createEmptyBorder(3,3,3,3));
setupLabel.setToolTipText("设置");
setupLabel.setBackground(barColor);
setupLabel.addMouseListener(this);
messageLabel = new JLabel(new ImageIcon(getClass().getResource(
"face/help.gif")));
messageLabel.setBorder(BorderFactory.createEmptyBorder(3,3,3,3));
messageLabel.setToolTipText("作者信息");
messageLabel.setBackground(barColor);
messageLabel.addMouseListener(this);
bar.addSeparator();
bar.add(newLabel);
bar.add(openLabel);
bar.add(saveLabel);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -