通过这个小游戏可以对Java用户图形界面的基础方面有进一步的认识。
这也是对于完成这个项目过程中的一些自我总结。
(还有就是这篇文章的目录不好用,我研究了好久也没琢磨出来怎么设置目录,各位大哥体谅一下新人la)
【推荐一波个人在用的配色网站:[link]https://coolors.co/】
提示:以下是本篇文章正文内容,下面案例可供参考
Java语言前身:Oak(橡树)在1995年5月23日改名为Java
1996年1月Sun公司发布了Java的第一个开发工具包(JDK1.0)
eclipse最初是有IBM公司开发的替代商业软件Visual Age for Java的下一代开发环境
2009年被Oracle公司以交易价值约为74亿美元收购(Java语言商标正式归Oracle所有,Java语言本身并不归属于哪家公司,它是由JCP组织进行管理)。
(Sun的英文翻译是太阳,eclipse的英文翻译是日食,感觉这个IBM在很早之前就想收购Sun公司了【司马昭之心嘛哈哈,这只是我自己认为的奥,毕竟这些大佬之间的交易谁能看的懂嘛】,但在2009年IBM公司最终出价每股9.4美元,低于甲骨文公司的每股9.5美元没竞争过甲骨文公司。)
现在Java版本好像已经到JDK15了不过好像JDK16也马上要发布了(这个男人怎么来越快了呢....)
共有5个类:主窗口类、游戏窗口类、参数设置窗口类、设置成功提示窗口类和工具类。
工具类主要是为了生成十个算数式子,代码如下:
package mathgame;
import java.util.Random;
/**
* 工具类
* @author yexiaoye
*
*/
public class Tools {
/**
* 生成十个式子的方法
*/
public static void rand(){
int a,b,operator;
Random ran = new Random();
for(int i= 0;i<10;i++){
a= ran.nextInt(MainMenu.max)+1;// 随机数范围
b= ran.nextInt(MainMenu.max)+1;
operator=ran.nextInt(MainMenu.operat)+1;// 自定义运算符
switch(operator){
case 1:// "+"
Game.question[i] = a + "+" + b + "=";
Game.result[i] = a + b;
break;
case 2:// "-"
Game.question[i] = a + "-" + b + "=";
Game.result[i] = a - b;
break;
case 3:// "*"
Game.question[i] = a + "*" + b + "=";
Game.result[i] = a * b;
break;
case 4:// "/"
Game.question[i] = a + "/" + b + "=";
Game.result[i] = a / b;
break;
}
}
}
}
MainMenu.Max// 从主类那里获取到的最大值max
其中最大值max和运算符operat定义为类级别的静态变量,为了给其他类的调用,
来完成参数设置和设置运算符的操作。
package mathgame;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
/**
* 主窗口
* @author yexiaoye
*
*/
public class MainMenu extends JFrame implements ActionListener{
private static final long serialVersionUID = 1L;
static int max = 20;// 声明int类型的全局变量max,为了给其他类的调用
static int operat = 2;// 声明运算符:1为+,2为-,3为*,4为/
// 主窗口中的组件
Container winContainer;// 声明容器
JMenuBar mbar;// 声明菜单栏
JMenu fileMenu,systemMenu;// 声明菜单组
JMenuItem startMenuItem,setMenuItem;// 声明子菜单项
JMenuItem exitMenuItem,helpMenuItem;
JLabel jl_hello;// 声明label
public MainMenu() {
super("GAME");
this.setBounds(400,150,500,400);// (x,y,width,height)
winContainer = this.getContentPane();// 获取当前框架的容器
winContainer.setLayout(null);// 自定义编辑布局方法(取消容器布局方式)
jl_hello = new JLabel("Hello World!");
jl_hello.setBounds(140, 100, 200, 40);
// 颜色转换网址:https://bj.96weixin.com/tools/rgb
jl_hello.setForeground(new Color(255,130,71));
jl_hello.setFont(new Font("微软雅黑", Font.BOLD, 30));
// 实例化菜单栏对象
mbar = new JMenuBar();
// 实例化菜单组
fileMenu = new JMenu("文件");
systemMenu = new JMenu("系统");
// 实例化子菜单项
startMenuItem = new JMenuItem("开始游戏");
setMenuItem = new JMenuItem("参数设置");
exitMenuItem = new JMenuItem("退出");
helpMenuItem = new JMenuItem("帮助");
// 注册监听器
startMenuItem.addActionListener(this);
setMenuItem.addActionListener(this);
exitMenuItem.addActionListener(this);
helpMenuItem.addActionListener(this);
this.setJMenuBar(mbar);// 设置菜单栏(将菜单栏添加到框架上)
mbar.add(fileMenu);// 将菜单组添加到菜单栏中
mbar.add(systemMenu);// 将子菜单项添加到菜单组中
// 将开始、参数设置子菜单项添加到文件菜单组中
fileMenu.add(startMenuItem);
fileMenu.add(setMenuItem);
// 将退出、帮助子菜单项添加到系统菜单组中
systemMenu.add(exitMenuItem);
systemMenu.add(helpMenuItem);
// 将欢迎标签添加到Container容器中
winContainer.add(jl_hello);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 框架关闭时,退出JVM
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == startMenuItem) {// 开始游戏按钮触发事件
winContainer.removeAll();// 清空当前winContainer(用户定义的Container名)上的所有控件
Game g1 = new Game();
g1.setSize(500, 400);
g1.setLayout(null);// 设置为null即为清空布局管理器,之后添加组件
winContainer.add(g1);
winContainer.repaint();
//new Game().setVisible(true);// 实例化游戏界面并设置可见性为true
}else if(e.getSource() == exitMenuItem) {// 退出按钮触发事件
System.exit(0);// 退出JVM
}else if(e.getSource() == setMenuItem){// 参数设置按钮触发事件
winContainer.removeAll();// 清空当前winContainer(用户定义的Container名)上的所有控件
SetGame s1 = new SetGame();// 实例化参数设置
s1.setSize(500, 400);// 必须设置s1对象的窗口大小
winContainer.add(s1);// 将对象s1添加到容器中
winContainer.repaint();// 在Container上生成新放置的控件后,使用此方法来刷新放置内容
}
}
public static void main(String[] args) {// 主方法
new MainMenu().setVisible(true);
}
}
removeAll()// 清空当前容器上的所有控件
repaint()// 刷新放置的内容
setDefaultCloseOperation()设置框架关闭时执行何种操作
EXIT_ON_CLOSE是JFrame类定义的常量字段,表示窗口关闭时执行System.exit(0);退出系统
package mathgame;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
/**
* 游戏窗口类
* @author yexiaoye
*
*/
public class Game extends JPanel implements ActionListener{
private static final long serialVersionUID = 1L;
/*JLabel label[]= new JLabel[10];// 显示10个随机的式子
JLabel err[] = new JLabel[10];// 显示10个提示信息
JTextField text[] = new JTextField[10];// 10个文本输入
static String[] question = new String[10];// 接收随机式子的字符串
static int[] result = new int[10];// 接收结果int变量*/
JLabel label[];
JLabel err[];
JTextField text[];
static String[] question;
static int[] result;
JLabel head;// 声明标题标签
JButton jb_enter;// 声明确认按钮
JButton jb_reset;// 声明重置按钮
public Game(){// 构造方法
//super("四则运算");// 初始化父类型特征
label = new JLabel[10];// 显示10个随机的式子
err = new JLabel[10];// 显示10个提示信息
text = new JTextField[10];// 10个文本输入
question = new String[10];// 接收随机式子的字符串
result = new int[10];// 接收结果int变量
Tools.rand();// 调用工具类中生成十个式子的方法
//this.setBounds(650, 250, 400, 300);// 设置主窗口大小
//Container c1 = this.getContentPane();// 获得当前框架的容器
//c1.setLayout(null);// 自定义编辑布局方法
head = new JLabel("四则运算小程序");
head.setBounds(145, -10, 120, 100);// 设置标签的显示位置和大小
head.setForeground(new Color(131,188,255));// 设置标签字体颜色
head.setFont(new Font("微软雅黑", Font.BOLD, 15));// 字体,加粗,字号
jb_enter = new JButton("确认");// 创建“确认”按钮对象
jb_reset = new JButton("重置");// 创建“重置”按钮对象
jb_enter.setBounds(110, 190, 60, 20);
jb_reset.setBounds(245, 190, 60, 20);
// 注册监听器
jb_enter.addActionListener(this);
jb_reset.addActionListener(this);
// 将组件添加到框架中
this.add(jb_reset);
this.add(jb_enter);
this.add(head);
// 循环出十个式子,每行两道题
for(int i = 0; i<10; i+=2){
label[i] = new JLabel(question[i]);// 第一列第i个式子
label[i].setBounds(70,70+10*i,60,15);
err[i]= new JLabel("");// 定义第一列第i个内容为""提示标签
err[i].setBounds(180,70+10*i,40,15);
err[i].setForeground(new Color(239,131,84));
text[i] = new JTextField("",20);// 第一列第i行文本输入框
text[i].setBounds(130,70+10*i,40,15);
label[i+1] = new JLabel(question[i+1]);// 第二列第i个式子
label[i+1].setBounds(230,70+10*i,60,15);
err[i+1] = new JLabel("");// 定义第二列第i个内容为""提示标签
err[i+1].setBounds(340,70+10*i,40,15);
err[i+1].setForeground(new Color(239,131,84));
text[i+1] = new JTextField("",20);// 第二列第i行文本输入框
text[i+1].setBounds(290,70+10*i,40,15);
// 将组件添加到框架中
this.add(label[i]);
this.add(label[i+1]);
this.add(err[i]);
this.add(err[i+1]);
this.add(text[i]);
this.add(text[i+1]);
}
//这句话需要注释,当在Jemnu实例化出此窗口,并且关闭时
//会关闭整个程序,非常的不合理!
//this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗口关闭时,退出JVM
this.setVisible(true);//可见性为true
}
int error = 0;// 错误题数计数器
// 监听按钮事件
public void actionPerformed(ActionEvent e) {
if(e.getSource()== jb_enter){// 单击确认按钮
for(int i = 0; i<10;i++){
try{
if(result[i] != Integer.parseInt(text[i].getText())){
error++;
err[i].setText("错误!");// 更改第i个err[]文本为错误
}else{
err[i].setText("正确!");// 更改第i个err[]文本为正确
}
}catch(NumberFormatException f){
JOptionPane.showMessageDialog(this,"请全部输入!","警告",JOptionPane.WARNING_MESSAGE);
error++;
break;
}
}
if(error == 0){
JOptionPane.showMessageDialog(this,"过关!","恭喜",1 );
}
}else if(e.getSource()==jb_reset){
Tools.rand();// 调用生成10个式子的方法
for(int i=0;i<10;i++){//通过循环重新赋值
err[i].setText("");
text[i].setText("");
label[i].setText(question[i]);
}
}
}
}
setForeground(Color.blue);// 设置标签字体颜色
// 还可以这样设置
setForeground(new Color(255,130,71));
setFont(new Font("微软雅黑", Font.BOLD, 15));// 字体,加粗,字号
设置式子最大值随机生成的范围
package mathgame;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
/**
* 游戏参数设置类
* @author yexiaoye
*
*/
public class SetGame extends JPanel implements ActionListener {//继承JPanel(面板)实现ActionListener(监听器)接口
private static final long serialVersionUID = 1L;
JButton jb_enter;// 参数设置确定键
JTextField jt_max;// 用户输入最大值的输入框
public SetGame(){// 无参构造方法
// 实例化组件
JLabel jl_reset = new JLabel("参数设置");
JLabel jl_number = new JLabel("运算数范围:1-");
jt_max = new JTextField(""+MainMenu.max,15);
jb_enter = new JButton("确定");
// 为确定按钮添加监听
jb_enter.addActionListener(this);
// 组件的参数设置
jl_reset.setFont(new Font("微软雅黑", Font.BOLD, 20));
jl_number.setFont(new Font("宋体", Font.BOLD, 15));
jl_reset.setForeground(Color.blue);
jl_reset.setBounds(180, 60, 120, 20);
jl_number.setBounds(150,110,120,20);
jt_max.setBounds(265, 110, 40, 20);
jb_enter.setBounds(190, 160, 65, 25);
// 将组件添加到JPanel
this.add(jl_reset);
this.add(jl_number);
this.add(jt_max);
this.add(jb_enter);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == jb_enter){
new SetPrompt().setVisible(true);
// 先将文本输入框中的string转换为int类型,在max值赋值给MainMenu中的max
MainMenu.max = Integer.parseInt(jt_max.getText());
}
}
}
提示用户参数设置成功
package mathgame;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
/**
* 参数设置成功提示类
* @author yexiaoye
*
*/
public class SetPrompt extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
JButton jb_enter;
/*
* jp_enter.add(jb_enter)// 将按钮添加面板上
* 暂时理解:JPanel也是一个Container所以无法在同一个frame上添加两个容器
*/
public SetPrompt(){
super("提示!");
this.setBounds(500,260,280,200);
Container c1 = this.getContentPane();
c1.setLayout(null);
JLabel jl_prompt = new JLabel("设置成功!");
jb_enter = new JButton("确认");
jb_enter.addActionListener(this);
jl_prompt.setFont(new Font("宋体",Font.BOLD,15));
jl_prompt.setBounds(85,45,80, 16);
jb_enter.setBounds(95,75, 65, 25);
c1.add(jb_enter);
c1.add(jl_prompt);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == jb_enter){// 实现按下确认键,关闭提示窗口
/*
* setDefaultCloseOperation():当窗口关闭时,执行何种操作:
* 1、DO_NOTHING_ON_CLOSE,不执行任何操作
* 2、HIDE_ON_CLOSE,只隐藏界面【相当于setVisible(false)】
-默认关闭状态:JFrame.class中: private int defaultCloseOperation = HIDE_ON_CLOSE;
-因此,默认情况下,关闭窗口,只隐藏界面,不释放占用的内存
* 3、DISPOSE_ON_CLOSE,隐藏并释放窗体,dispose(),当最后一个窗口被释放后,则程序也随之运行结束。
* 4、EXIT_ON_CLOSE,直接关闭应用程序,【相当于System.exit(0),直接关闭所有】
*/
// this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
// this.setDefaultCloseOperation(3);
// System.exit(0);// 按钮已经注册监听
// 弹出提示窗口后用户点击确认按钮弹出游戏界面
//new Game().setVisible(true);// 实例化游戏界面并设置可见性为true
}
}
}
这个小游戏还有很多不足,比如主窗口上面的东西还不够完善,还没有添加自定义运算符的功能等等等.....我会在以后哟有空的时候慢慢完善滴。
还有就是在参数设置提示类里面实现用户点击确定按钮就关闭这个弹窗,翻了好多资料也没找到解决办法,导致后来我想改为点击确定直接弹出游戏界面都没心情做了(请允许我为我的懒找借口,哈哈哈哈)
还有就是希望有大佬来指出我这个程序中的不足,谢谢啦,谢谢啦,谢谢啦
如果觉得还可以的话可以点击这里支持下小叶呀![link]https://download.csdn.net/download/weixin_50957373/13696896