java_day14

目标:Java web开发

ChineseChess.java解析完毕,象棋程序累计解析\(1/8\)


package cn.edu.ouc.chineseChess;
 
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.LinkedList;
 
/**
 * 象棋主类
 * 
 * @author cnlht
 */
public class ChineseChess extends JFrame implements ActionListener {
	ChessBoard board = null;
	Demon demon = null;
	MakeChessManual record = null;
	Container con = null;
	JMenuBar bar;//菜单条
	JMenu fileMenu;//菜单
	JMenuItem 制作棋谱, 保存棋谱, 演示棋谱;//菜单项
	//菜单项放在菜单里,菜单放在菜单条里
	JFileChooser fileChooser = null;//文件选择器,打开文件,保存文件
	LinkedList 棋谱 = null;
 
	public ChineseChess() {
		bar = new JMenuBar();
		fileMenu = new JMenu("中国象棋");
		制作棋谱 = new JMenuItem("制作棋谱");
		保存棋谱 = new JMenuItem("保存棋谱");
		保存棋谱.setEnabled(false);//设置按钮不可点击
		演示棋谱 = new JMenuItem("演示棋谱");
		fileChooser = new JFileChooser();
		fileMenu.add(制作棋谱);
		fileMenu.add(保存棋谱);
		fileMenu.add(演示棋谱);
		bar.add(fileMenu);
		setJMenuBar(bar);
		setTitle(制作棋谱.getText());
		制作棋谱.addActionListener(this);//将三个按钮加入到一个监听器以监听事件源产生的事件。this是事件源
		保存棋谱.addActionListener(this);
		演示棋谱.addActionListener(this);
		board = new ChessBoard(45, 45, 9, 10);
		record = board.record;
		con = getContentPane();
		JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true,
				board, record);//创建一个就具有指定方向,能连续重新显示组件和具有指定组件的分割板
		split.setDividerSize(5);//设置分割条的大小
		split.setDividerLocation(460);//设置分割条的位置
		con.add(split, BorderLayout.CENTER);
//		addWindowListener(new WindowAdapter() {
//			public void windowClosing(WindowEvent e) {
//				System.exit(0);
//			}
//		});对Windows窗口关闭程序进行重写
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
		setBounds(60, 20, 690, 540);//相当于这两行代码:setSize(690,540);setLocation(60,20);
	}
 
	public void actionPerformed(ActionEvent e){
		//当用户点击按钮时,程序调用actionPerformed方法,通过if语句来判断是哪一个按钮被点击,然后在对话框中显示相应的内容。
		if (e.getSource() == 制作棋谱) {
			con.removeAll();//去掉所有组件,不清除布局
			保存棋谱.setEnabled(true);
			this.setTitle(制作棋谱.getText());
			board = new ChessBoard(45, 45, 9, 10);
			record = board.record;
			JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
					true, board, record);
			split.setDividerSize(5);
			split.setDividerLocation(460);
			con.add(split, BorderLayout.CENTER);
			validate();//重新绘制
		}
		if (e.getSource() == 保存棋谱) {
			int state = fileChooser.showSaveDialog(null);
			File saveFile = fileChooser.getSelectedFile();
			if (saveFile != null && state == JFileChooser.APPROVE_OPTION) {
				try {
					FileOutputStream outOne = new FileOutputStream(saveFile);
					ObjectOutputStream outTwo = new ObjectOutputStream(outOne);
					outTwo.writeObject(record.获取棋谱());
					outOne.close();
					outTwo.close();
				} catch (IOException event) {
				}
			}
		}
		if (e.getSource() == 演示棋谱) {
			con.removeAll();
			con.repaint();
			con.validate();
			validate();
			保存棋谱.setEnabled(false);
 
//			fileChooser.setCurrentDirectory(new File("D:\\codes"));
//			fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
			int state = fileChooser.showOpenDialog(null);//显示文件导航框,返回值有三个CANCEL,APPROVE,ERROR
			File openFile = fileChooser.getSelectedFile();//获取文件
			if (openFile != null && state == JFileChooser.APPROVE_OPTION) {
				try {
					FileInputStream inOne = new FileInputStream(openFile);//文件输入
					ObjectInputStream inTwo = new ObjectInputStream(inOne);
					棋谱 = (LinkedList) inTwo.readObject();
					inOne.close();
					inTwo.close();
					ChessBoard board = new ChessBoard(45, 45, 9, 10);
					demon = new Demon(board);
					demon.set棋谱(棋谱);
					con.add(demon, BorderLayout.CENTER);
					con.validate();
					validate();
					this.setTitle(演示棋谱.getText() + ":" + openFile);
				} catch (Exception event) {//异常处理方法————try,catch
					JLabel label = new JLabel("不是棋谱文件");
					label.setFont(new Font("隶书", Font.BOLD, 60));
					label.setForeground(Color.red);
					label.setHorizontalAlignment(SwingConstants.CENTER);
					con.add(label, BorderLayout.CENTER);
					con.validate();
					this.setTitle("没有打开棋谱");
					validate();
				}
			} else {
				JLabel label = new JLabel("没有打开棋谱文件呢");
				label.setFont(new Font("隶书", Font.BOLD, 50));//new Font(String 字体,int 风格,int 字号);
				//风格有三种:Font.PLAIN, Font.BOLD, Font.ITALIC,普通,粗体和斜体
				label.setForeground(Color.pink);//设置前景色为粉色
				label.setHorizontalAlignment(SwingConstants.CENTER);//水平对齐,居中对其
				/*
				etHorizontalAlignment:设置水平对齐方式;
    				      它的有效参数是:
     				          SwingConstants.LEFT:左对齐;(默认值,也就是不设置时则左对齐)
     				          SwingConstants.CENTER:居中对齐;
     				          SwingConstants.RIGHT:右对齐;
    			        setVerticalAlignment:设置垂直对齐方式;
    				      它的有效参数是:
					    SwingConstants.TOP:向上对齐;
   					    SwingConstants.CENTER:居中对齐;(默认值,也就是不设置时居中对齐)
   					    SwingConstants.BOTTOM:向下对齐;
				 */
				con.add(label, BorderLayout.CENTER);
				con.validate();
				this.setTitle("没有打开棋谱文件呢");
				validate();
			}
		}
	}
 
	public static void main(String args[]) {
		new ChineseChess();
	}
}

接下来:

ChessBoard board = null;//象棋棋盘类
Demon demon = null;//演示棋谱类
MakeChessManual record = null;//制作棋谱类
posted @ 2021-07-20 21:54  zhuangzhongxu  阅读(37)  评论(0)    收藏  举报