java_day13

目标:Java web开发

swing算是会了,再看ChineseChess类:

好,extends是创建一个子类,implements是重写接口,这么写是要干啥捏?
放大佬的代码,加注释:

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;//这三个类在其他class里面被定义
	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("演示棋谱");
		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);//从这里再往下还没看懂,所以暂时没有注释qwq
		split.setDividerSize(5);
		split.setDividerLocation(460);
		con.add(split, BorderLayout.CENTER);
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		setVisible(true);
		setBounds(60, 20, 690, 540);
		fileChooser = new JFileChooser();
		con.validate();
		validate();
	}
 
	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);
 
			int state = fileChooser.showOpenDialog(null);
			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) {
					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));
				label.setForeground(Color.pink);
				label.setHorizontalAlignment(SwingConstants.CENTER);
				con.add(label, BorderLayout.CENTER);
				con.validate();
				this.setTitle("没有打开棋谱文件呢");
				validate();
			}
		}
	}
 
	public static void main(String args[]) {
		new ChineseChess();
	}
}

关于JMenu,JMenuBar,JMenuItem的关系:

import java.awt.*;
import javax.swing.*;
class swingjmenu extends JFrame{
	JMenuBar jmb;	//菜单栏
	JMenu jm1,jm2,jm3,jm4,jm5;	//菜单
	JMenu jm6,jm7,jm8,jm9;		//菜单中的菜单
	JMenuItem jmi1,jmi2,jmi3,jmi4,jmi5;		//菜单项
	public static void main(String[] args){
		swingjmenu a=new swingjmenu();
	}
	public swingjmenu(){
		//创建组件
		jmb=new JMenuBar();		//创建菜单栏
		jm1=new JMenu("菜单1");	//创建菜单
		jm2=new JMenu("菜单2");
		jm3=new JMenu("菜单3");
		jm4=new JMenu("菜单4");
		jm5=new JMenu("菜单5");
		jm6=new JMenu("菜单6");
		jm7=new JMenu("菜单7");
		jm8=new JMenu("菜单8");
		jm9=new JMenu("菜单9");
		jmi1=new JMenuItem("子菜单1");	//创建子菜单
		jmi2=new JMenuItem("子菜单2");
		jmi3=new JMenuItem("子菜单3");
		jmi4=new JMenuItem("子菜单4");
		jmi5=new JMenuItem("子菜单5");
		//添加组件
		jm6.add(jmi1);	//把菜单项添加到菜单中
		jm6.add(jmi2);
		jm6.add(jmi3);
		jm6.add(jmi4);
		jm6.add(jmi5);
		jm1.add(jm6);	//把菜单添加到菜单中
		jm1.add(jm7);
		jm1.add(jm8);
		jm1.add(jm9);
		jmb.add(jm1);	//把菜单添加到菜单栏中
		jmb.add(jm2);
		jmb.add(jm3);
		jmb.add(jm4);
		jmb.add(jm5);
		this.add(jmb,BorderLayout.NORTH);	//把菜单栏添加到框架北部
		//设置界面属性
		this.setTitle("菜单栏");		//设置界面标题
		this.setSize(300, 250);				//设置界面大小
		this.setLocation(200, 200);			//设置界面初始位置
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	//设置界面关闭后退出
		this.setVisible(true);				//设置界面可视化
	}
}

效果(虽然没有设置监听事件,用鼠标点击之后没反应):

posted @ 2021-07-19 21:58  zhuangzhongxu  阅读(45)  评论(0)    收藏  举报