为了深刻学习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路漫漫,唯有君作伴~
发表回复