📄 mainframe.java
字号:
package view;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;//Dimension 类封装单个对象中组件的宽度和高度(精确到整数)。该类与组件的某个属性关联
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.Toolkit;//Toolkit 的子类被用于将各种组件绑定到特定本机工具包实现。
import java.awt.event.ActionListener;
import java.awt.event.MouseListener;
import java.awt.event.WindowListener;
import java.util.ArrayList;//List 接口的大小可变数组的实现
import java.util.Observable;
import java.util.Observer;//表示应用程序想要观察的对象
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.UIManager;//UIManager 管理当前外观、可用外观集合、外观更改时被通知
import model.Model;
import control.Control;
//extends:继承;implment:实现接口实现多继承
public class MainFrame extends JFrame implements Observer {
private static final long serialVersionUID = 1L;
public static void main(String[] args) {
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");//如何根据类名称设置外观
} catch (Exception e) {
e.printStackTrace();
}
Model model = new Model();
MainFrame frame = new MainFrame(model);
model.addObserver(frame);//如果观察者与集合中已有的观察者不同,则向对象的察者集中添加此观察者。
Control control = new Control(model);
frame.addController(control);
}
private JButton btnAbout;
private JButton btnStart, btnRefresh, btnRemind, btnDemo;
private Container c = this.getContentPane();
private JComboBox cboLevel;
private GamePanel gPanel;
private JLabel lblHistory;
private JLabel lblLeave;
private JLabel lblTimer;
private Model model;
private JPanel setPanel;
private JPanel statPanel;
private JPanel toolPanel;
public MainFrame(Model model) {
this.model = model;
initComponents();
setPanel.add(btnAbout);
setPanel.add(new JLabel("等级"));
setPanel.add(cboLevel);
statPanel.add(lblTimer);
statPanel.add(lblLeave);
statPanel.add(lblHistory);
toolPanel.add(btnStart);
toolPanel.add(btnRefresh);
toolPanel.add(btnRemind);
toolPanel.add(btnDemo);
setSize(740, 510);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();//获取默认工具包。
if (model.getLocation() == null)
setLocation(screenSize.width / 2 - getWidth() / 2,
screenSize.height / 2 - getHeight() / 2 - 100);
else
setLocation(model.getLocation());
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
c.setLayout(new BorderLayout());
c.add(setPanel, BorderLayout.NORTH);
c.add(toolPanel, BorderLayout.EAST);
c.add(gPanel, BorderLayout.CENTER);
c.add(statPanel, BorderLayout.SOUTH);
try {
setCursor(Toolkit.getDefaultToolkit().createCustomCursor(
ImageLoader.getCursorImage(), new Point(0, 0),"cursor"));
} catch (Exception e) {
e.printStackTrace();
}
setVisible(true);
}
public void addController(Object obj) {
if(obj instanceof MouseListener) {
gPanel.addMouseListener((MouseListener) obj);
}
if (obj instanceof ActionListener) {
ActionListener al = (ActionListener) obj;
cboLevel.addActionListener(al);
btnAbout.addActionListener(al);
btnStart.addActionListener(al);
btnRefresh.addActionListener(al);
btnRemind.addActionListener(al);
btnDemo.addActionListener(al);
}
if (obj instanceof WindowListener) {
addWindowListener((WindowListener) obj);
}
}
private void initComponents() {
cboLevel = new JComboBox();
cboLevel.addItem("随机");
for (int i = 1; i <= 9; i++) {
cboLevel.addItem(i + "");
}
cboLevel.setSelectedItem(model.getLevel() + "");
btnAbout = new JButton("About");
lblTimer = new JLabel();
lblLeave = new JLabel();
lblHistory = new JLabel();
lblHistory.setForeground(Color.BLUE);
btnStart = new JButton("开始");
btnStart.setActionCommand("start");
btnRefresh = new JButton("刷新");
btnRefresh.setActionCommand("refresh");
btnRemind = new JButton("提示");
btnRemind.setActionCommand("remind");
btnDemo = new JButton("演示");
btnDemo.setActionCommand("demo");
gPanel = new GamePanel(model);
setPanel = new JPanel();
setPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
toolPanel = new JPanel();
toolPanel.setLayout(new GridLayout(7, 1, 0, 20));
toolPanel.setPreferredSize(new Dimension(80, 100));
statPanel = new JPanel();
statPanel.setLayout(new GridLayout(1, 4));
}
private void showAbout() {
JOptionPane.showMessageDialog(this, "www.wenbing4375@sina.com.cn(邮箱)\n欢迎提供宝贵意见!!!!\n邮编:230037", "About",
JOptionPane.INFORMATION_MESSAGE, new ImageIcon(ImageLoader
.getIconImage()));
}//值得借鉴
public void update(Observable obs, final Object obj) {
if (obj instanceof ArrayList) {
gPanel.showPath(obj);
} else if (obj instanceof String) {
if (obj.equals("timer")) {
lblTimer.setText("所用时间" + model.getSeconds() + "秒");
lblLeave.setText("剩余:" + model.getLeave() + "个" + " 本轮可消除"
+ model.solutionCount() + "对");
lblHistory.setText("历史纪录" + model.getHistoryRecord() + "秒");
} else if (obj.equals("breakrecord")) {
JOptionPane.showMessageDialog(this, "恭喜打破纪录!" + "\n原来纪录:"
+ model.getHistoryRecord() + "秒" + "\n你用时间:"
+ model.getSeconds() + "秒");
} else if (obj.equals("demofinished")) {
JOptionPane.showMessageDialog(this, "演示完成!");
btnDemo.setText("演示");
} else if (obj.equals("finished")) {
lblLeave.setText("完成");
} else if (obj.equals("nosolution")) {
JOptionPane.showMessageDialog(this, "无解!确定后自动刷新.");
} else if (obj.equals("about")) {
showAbout();
}
} else {
repaint();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -