为了深刻学习Java中GUI与事件处理机制,利用java中的GUI与事件处理机制等性能实现围棋小游戏。
效果图
一、概述
1、GUI是指图形用户界面也称图形用户接口,在Java中是进行人机交互的窗口,在这个窗口中用户能够实现应用程序提供的所有性能。事件处理机制在上一篇文章中有具体介绍,这里不多阐明。
二、设计
(自己的设计思维是:先设计一个整体的框架,再往设计好的框架中退出组件,并一步步的进行调试,争取每步都在正确的路线上,各代码之间互相交融。)
1、逻辑设计
1)、首先创立一个顶级窗口容器类myframe,作为整体的框架。
2)、而后创立规定类Rule,退出到框架中
3)、而后创立棋盘类ChessPad,退出到框架中,再在棋盘类中增加具体的组件,比如说一个从新开始按钮和两个用于提醒作用的文本框,如上效果图。
4)、再创立黑棋子类Chess_black和白棋子类Chess_white,退出到棋盘类中
5)、最初创立实现鼠标监听事件类Listen,用于实现各组件的产生的事件。
6)、最初创立一个主类mains,用于启动程序。
留神:这里其实是有三个容器,一个顶级窗口容器属于最顶级的,一个规定类容器(因为这里我是用继承JPanel面板容器实现的)和一个棋盘类容器(还是用继承JPanel面板容器实现的)。我把各种组件都是增加到棋盘类容器中的,所以当实现组件产生的事件时,其实是在棋盘类容器中进行各种操作的,而不是在顶级窗口容器中。
2、代码实现
(1)、这里通过创立一个窗口类myfame继承JFrame类来创立顶级窗口容器。留神:这里的窗口类布局管理器为空布局。
package 单机围棋; import javax.swing.JFrame; class myframe extends JFrame//窗口类{ private static final long serialVersionUID=2l; ChessPad chessPad=new ChessPad(); //办法定义 public void display()//窗口设置 { setTitle("围棋"); setLayout(null);//设置容器布局为空布局 setSize(570,560);//窗口大小 /***********************************************/ Rule rule=new Rule();//规定面板类对象 add(rule); rule.setBounds(60, 20, 440, 30);//设置规定面板类在窗口中的地位和大小 /***********************************************/ ChessPad chessPad=new ChessPad();//棋盘面板类对象 add(chessPad); chessPad.setBounds(60, 60, 440, 440);//设置棋盘面板类在窗口中的地位和大小 /***********************************************/ setVisible(true);//窗口为可见 setResizable(false);//不可扭转窗口大小 setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); }}
(2)、通过创立一个Rule类继承JPanel面板容器实现规定面板,再退出到顶级窗口容器中,并设置在窗口中的地位。
package 单机围棋; import java.awt.Color; import javax.swing.JLabel;import javax.swing.JPanel; public class Rule extends JPanel//规定面板类{ private static final long serialVersionUID=2l; //属性定义 JLabel label;//标签 //办法定义 public Rule() { setBackground(Color.orange);//面板色彩 setSize(440, 30);//面板大小 label=new JLabel("单击左键下棋子,双击左键吃棋子,落子无悔!请谨慎!"); add(label); }}
(3)、通过创立棋盘类ChessPad继承JPanel面板容器实现棋盘,并在棋盘容器中退出从新开始组件,一个标签组件,和两个文本框组件。
package 单机围棋; import java.awt.Color;import java.awt.Graphics; import javax.swing.JButton;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JTextField; public class ChessPad extends JPanel//棋盘面板类{ private static final long serialVersionUID=3l; //属性定义 JButton button;//按钮 JTextField text1,text2;//文本框 JLabel label;//标签 Listen listen=new Listen();//创立监听器对象 //办法定义 ChessPad()//构造方法 { setSize(440,440);//棋盘面板大小 setLayout(null);//棋盘布局为空 setBackground(Color.orange);//面板色彩 button=new JButton("从新开始"); add(button); button.addMouseListener(listen);//在按钮中增加监听器 button.setBounds(3, 10, 85, 20); text1=new JTextField("请黑棋下子"); add(text1); text1.addMouseListener(listen);//在文本框1中增加监听器 text1.setBounds(92, 10, 100, 20); label=new JLabel("提示框:"); add(label); label.setBounds(214, 10, 60, 20); text2=new JTextField("游戏开始,请黑棋先下子"); add(text2); text2.setBounds(257, 10, 180, 20);//在文本框2中增加监听器 listen.set1(button, this);//把按钮实例对象和棋盘实例对象传入实现监听事件类的中 listen.set2(text1, text2,label);//把文本框实例对象和标签实例对象传入实现监听事件类的中 addMouseListener(listen);//在棋盘类中增加监听器,留神这里是吧整个棋盘面板作为事件源 } @Override public void paintComponent(Graphics g)//画线,棋盘行列间距为40像素,行列为19 { super.paintComponent(g); for(int i=40;i<=400;i=i+20) g.drawLine(40, i, 400, i); for(int j=40;j<=400;j=j+20) g.drawLine(j, 40, j, 400); //在棋盘的指定地位绘制实心圆,留神左上角坐标不是圆心坐标 g.fillOval(97, 97, 6, 6); g.fillOval(337, 97, 6, 6); g.fillOval(97, 337, 6, 6); g.fillOval(337, 337, 6, 6); g.fillOval(217, 217, 6, 6); } public void paintchess()//在棋盘上画棋子的办法 { Graphics p=getGraphics(); p.fillOval(96, 96, 10, 10); }}
(4)、创立黑棋子类,并实现MouseListener接口用来在本身类中实现”双击黑棋子进行吃黑棋子“的性能。这里的黑棋是通过继承JPanel容器实现的,也就是说黑棋子其实也是个面板容器(同样白棋子也是)。
package 单机围棋; import java.awt.Color;import java.awt.Graphics;import java.awt.event.MouseEvent;import java.awt.event.MouseListener; import javax.swing.JPanel; public class Chess_black extends JPanel implements MouseListener//黑棋子类继承面板容器,本身实现鼠标点击事件{ public static final long serialVersionUID=03l;//序列号 ChessPad chessPad; public void get(ChessPad chessPad)//传入棋盘实例对象 { this.chessPad=chessPad; } public Chess_black()//定义黑棋子面板容器大小,并增加鼠标事件监听器 { setSize(20,20); addMouseListener(this); } @Override public void paint(Graphics p)//定义黑棋子色彩宽高 { p.setColor(Color.black); p.fillOval(0, 0, 20, 20); } @Override public void mouseClicked(MouseEvent e)//实现鼠标监听事件 { if (e.getClickCount()>=2)//如果鼠标间断点击了两下或以上 { if(e.getSource()==this)//如果鼠标点击的是黑棋子组件 { chessPad.remove(this);//在棋盘面板容器中移除被点击的黑棋子组件 chessPad.repaint();//刷新棋盘,如果不刷新,则会显示异样 } } } public void mousePressed(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {}}
(5)、应用与创立黑棋子类雷同的办法创立白棋子Chess_white。
package 单机围棋; import java.awt.Color;import java.awt.Graphics;import java.awt.event.MouseEvent;import java.awt.event.MouseListener; import javax.swing.JPanel; public class Chess_white extends JPanel implements MouseListener{ public static final long serialVersionUID=02l;//序列号 ChessPad chessPad; public void get(ChessPad chessPad) { this.chessPad=chessPad; } public Chess_white() { setSize(20,20); addMouseListener(this); } @Override public void paint(Graphics p)//重写paint办法画好白棋子对象色彩和大小。该办法为在面板容器中应用的用来设计面板款式的办法, //所以只有调用该办法所在类的容器对象,就能够显示该办法所设计的容器的样子 { p.setColor(Color.white); p.fillOval(0, 0, 20, 20); } @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount()>=2) { if(e.getSource()==this) { chessPad.remove(this); chessPad.repaint(); } } } public void mousePressed(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {}}
(6)、鼠标监听事件类Listen,用于实现各组件相应的性能。
package 单机围棋; import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent; import javax.swing.JButton;import javax.swing.JLabel;import javax.swing.JTextField; public class Listen extends MouseAdapter//实现鼠标点击事件{ JButton button; ChessPad chessPad; JTextField text1,text2; JLabel label; int x,y; int color=0;//让黑棋先落子 Chess_black chessblack; Chess_white chesswhite; public void set1(JButton button,ChessPad chessPad)//传入组件实例对象,并初始化 { this.button=button; this.chessPad=chessPad; } public void set2(JTextField text1,JTextField text2,JLabel label)//传入组件实例对象,并初始化 { this.text1=text1; this.text2=text2; this.label=label; } @Override public void mouseClicked(MouseEvent e)//鼠标在组件上单击(按下并开释)时调用该办法。 { if(e.getSource()==button)//从新开始事件的实现 { chessPad.removeAll();//删除容器中所有组件 chessPad.repaint();//刷新容器显示界面 //从新往容器中增加组件 chessPad.add(button); chessPad.add(text1); chessPad.text1.setText("请黑棋下子"); chessPad.add(label); chessPad.add(text2); chessPad.text2.setText("从新开始了,请黑棋先下子"); color=0;//色彩从新设置为0,从新从黑棋开始下 } //失去鼠标在容器中的坐标 x=e.getX(); y=e.getY(); //失去坐标在棋盘上的行列地位 int a=(x+9-20)/20;//行地位 int b=(y+9-20)/20;//列地位 if(e.getSource()==chessPad)//在棋盘上下棋事件的实现 { if(x<35||y<35||x>405||y>405)//判断鼠标下棋地位,若超出棋盘地位则不落子 { chessPad.text2.setText("别乱点!棋只能下在棋盘下面!");//鼠标超出棋盘地位,不落子 } else//鼠标在棋盘中,开始落子 { if(color==1)//若棋子色彩为1,则落白子 { chesswhite=new Chess_white();//定义白棋子组件实例对象 chesswhite.get(chessPad); chessPad.add(chesswhite);//往棋盘容器中增加白子 chesswhite.setBounds(a*20+10, b*20+10, 20, 20);//白子落子地位 chessPad.text1.setText("请黑棋下子"); chessPad.text2.setText(null); color--;//棋子色彩设置0,管制下一步落子色彩为黑子 } else if(color==0)//若棋子色彩为0,则落黑子 { chessblack=new Chess_black();//定义黑棋子组件的实例对象 chessblack.get(chessPad); chessPad.add(chessblack);//往棋盘容器中增加黑子 chessblack.setBounds(a*20+10, b*20+10, 20, 20);//黑子落子地位 chessPad.text1.setText("请白棋下子"); chessPad.text2.setText(null); color++;//棋子色彩设置为1,管制下一步落子为白子 } } } }}
(7)、鼠标监听事件类Listen创立
package 单机围棋; import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent; import javax.swing.JButton;import javax.swing.JLabel;import javax.swing.JTextField; public class Listen extends MouseAdapter//实现鼠标点击事件{ JButton button; ChessPad chessPad; JTextField text1,text2; JLabel label; int x,y; int color=0;//让黑棋先落子 Chess_black chessblack; Chess_white chesswhite; public void set1(JButton button,ChessPad chessPad)//传入组件实例对象,并初始化 { this.button=button; this.chessPad=chessPad; } public void set2(JTextField text1,JTextField text2,JLabel label)//传入组件实例对象,并初始化 { this.text1=text1; this.text2=text2; this.label=label; } @Override public void mouseClicked(MouseEvent e)//鼠标在组件上单击(按下并开释)时调用该办法。 { if(e.getSource()==button)//从新开始事件的实现 { chessPad.removeAll();//删除容器中所有组件 chessPad.repaint();//刷新容器显示界面 //从新往容器中增加组件 chessPad.add(button); chessPad.add(text1); chessPad.text1.setText("请黑棋下子"); chessPad.add(label); chessPad.add(text2); chessPad.text2.setText("从新开始了,请黑棋先下子"); color=0;//色彩从新设置为0,从新从黑棋开始下 } //失去鼠标在容器中的坐标 x=e.getX(); y=e.getY(); //失去坐标在棋盘上的行列地位 int a=(x+9-20)/20;//行地位 int b=(y+9-20)/20;//列地位 if(e.getSource()==chessPad)//在棋盘上下棋事件的实现 { if(x<35||y<35||x>405||y>405)//判断鼠标下棋地位,若超出棋盘地位则不落子 { chessPad.text2.setText("别乱点!棋只能下在棋盘下面!");//鼠标超出棋盘地位,不落子 } else//鼠标在棋盘中,开始落子 { if(color==1)//若棋子色彩为1,则落白子 { chesswhite=new Chess_white();//定义白棋子组件实例对象 chesswhite.get(chessPad); chessPad.add(chesswhite);//往棋盘容器中增加白子 chesswhite.setBounds(a*20+10, b*20+10, 20, 20);//白子落子地位 chessPad.text1.setText("请黑棋下子"); chessPad.text2.setText(null); color--;//棋子色彩设置0,管制下一步落子色彩为黑子 } else if(color==0)//若棋子色彩为0,则落黑子 { chessblack=new Chess_black();//定义黑棋子组件的实例对象 chessblack.get(chessPad); chessPad.add(chessblack);//往棋盘容器中增加黑子 chessblack.setBounds(a*20+10, b*20+10, 20, 20);//黑子落子地位 chessPad.text1.setText("请白棋下子"); chessPad.text2.setText(null); color++;//棋子色彩设置为1,管制下一步落子为白子 } } } }}
(8)、主类mains创立,最初启动主类既可启动程序,进行围棋游戏啦!!
package 单机围棋; public class mains{ public static void main (String []args) { new myframe().display(); }}
三、总结
通过这次小游戏的实现,理解把握GUI图形界面的设计,并学习界面中各组件与事件处理机制的性能交互实现。这里次要是使用到了JPanel容器(JPanel又称面板,是Java中最罕用的轻量级容器之一,其默认布局管理器是FlowLayout(流式布局管理器)。JPanel能够包容其余组件,但其自身不可见,须要退出到顶级容器中能力存在,因而也称为两头容器,JPanel之间能够嵌套,对组件进行组合。)来实现界面的设计。当然也能够应用其余的组件或者容器来进行界面的设计,并且也能够增加其余组件来实现相应更简单的性能,但因为图形界面的设计并不是Java的强项,也因为GUI倒退的停滞,这里不对GUI作深刻的理解。本文旨在学习Java事件处理机制以及事件处理机制实现性能的过程,并对设计模式有肯定的学习和理解,并标准代码的实现,给自己本人找准一种学习的思路,也心愿能给读者带来帮忙。
Java路漫漫,唯有君作伴~