java gui编程介绍

原创 2016年08月28日 15:41:22

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="white-space:pre">	</span>java GUI编程是java体系中相对比较不受重视的一个部分 ,相比较其他语言中的图形界面,GUI没有什么优势,所以这个GUI看起来似乎并没有什么卵用。不过大多数语言的图形界面原理大都是类似的,对于初学java的人来说,学习了这个部分可以自己尝试做一些小的游戏,以后学习其他语言类似部分时也会比较容易上手。在介绍完这部分的大致内容时,我会上传一个简单的小游戏flappy bird供大家练练手。</span>

接下来我介绍一下学习GUI的几个部分,内容并不多大家可以去看一下,java基础前面的内容学完之后,这部分的内容会很容易理解

1.AWT(Abstract window Toolkit).用于java的GUI(Graphics User Interface图形用户界面)编程,但是AWT的缺点过于明显,所以后来在Swing中出现了一些类取代了AWT,但用法是类似的。

2.组件和容器 这个部分时java的图形界面排布的重要组成部分,几乎所有的图像界面都逃不过这两个组件,容器有Frame和Panel等等,组件则是button textField之类的

3.布局管理器 这是安排 组件在容器中的排版模式的  

4.事件处理 这个是这个模块比较抽象化的一部分,因为涉及到了监听这个概念。如果之前基础没有学得很好的话,这个部分就比较难了,比较典型的事件就是MouseListener和KeyListener。

5.java图形处理  画笔 GUI中的画图工具,比如说在Frame中画一个圆 矩形什么的

6.Window事件     这个也是属于事件处理的一部分 不过相对来说会特别一点,所以一般会单独拿出来讲

接下来上传一个之前很火的小游戏flappy Bird,游戏逻辑很简单,大家尝试一下,可以巩固一下学习的内容,也能锻炼 

package com.qianfeng.bird;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class BirdGame extends JPanel {
	Bird bird;
	Column column1, column2;
	Ground ground;
	BufferedImage background;
	/** 游戏状态 */
	int state;
	public static final int START = 0;
	public static final int RUNNING = 1;
	public static final int GAME_OVER = 2;
	BufferedImage gameOverImage;
	BufferedImage startImage;
	// 分数
	int score;
	/** 初始化 BirdGame `的属性变量 */
	public BirdGame() throws Exception {
		state = START;
		startImage = ImageIO.read(getClass().getResource("start.png"));
		gameOverImage = ImageIO.read(getClass().getResource("gameover.png"));
		score = 0;
		bird = new Bird();
		column1 = new Column(1);
		column2 = new Column(2);
		ground = new Ground();
		background = ImageIO.read(getClass().getResource("bg.png"));
	}
	/** "重写(修改)"paint方法实现绘制 */
	public void paint(Graphics g) {
		g.drawImage(background, 0, 0, null);
		g.drawImage(column1.image, column1.x - column1.width / 2, column1.y
				- column1.height / 2, null);
		g.drawImage(column2.image, column2.x - column2.width / 2, column2.y
				- column2.height / 2, null);
		// 在paint方法中添加绘制分数的算法
		Font f = new Font(Font.SANS_SERIF, Font.BOLD, 40);
		g.setFont(f);
		g.drawString("" + score, 40, 60);
		g.setColor(Color.WHITE);
		g.drawString("" + score, 40 - 3, 60 - 3);
		g.drawImage(ground.image, ground.x, ground.y, null);
		// 旋转(rotate)绘图坐标系,是API方法
		Graphics2D g2 = (Graphics2D) g;
		g2.rotate(-bird.alpha, bird.x, bird.y);
		g.drawImage(bird.image, bird.x - bird.width / 2, bird.y - bird.height
				/ 2, null);
		g2.rotate(bird.alpha, bird.x, bird.y);
		// 在paint方法中添加显示游戏结束状态代码
		switch (state) {
		case GAME_OVER:
			g.drawImage(gameOverImage, 0, 0, null);
			break;
		case START:
			g.drawImage(startImage, 0, 0, null);
			break;
		}

		// 添加调试的方框
		/*
<span style="white-space:pre">		</span> g.drawRect(bird.x-bird.size/2,
		 bird.y-bird.size/2,
		 bird.size, bird.size);
		 g.drawRect(column1.x-column1.width/2,
		 column1.y-column1.height/2,
		 column1.width,
		 column1.height/2-column1.gap/2);
		 g.drawRect(column1.x-column1.width/2,
		 column1.y+column1.gap/2,
		 column1.width,
		 column1.height/2-column1.gap/2);
		 g.drawRect(column2.x-column2.width/2,
				 column2.y-column2.height/2,
				 column2.width,
				 column2.height/2-column2.gap/2);
				 g.drawRect(column2.x-column2.width/2,
				 column2.y+column2.gap/2,
				 column2.width,
				 column2.height/2-column2.gap/2);
<span style="white-space:pre">		</span>*/
	}// paint方法的结束
		// BirdGame中添加方法action()

	public void action() throws Exception {
		MouseListener l = new MouseAdapter() {
			// Mouse 老鼠 Pressed按下
			public void mousePressed(MouseEvent e) {
				try {
					switch (state) {
					case GAME_OVER:
						column1 = new Column(1);
						column2 = new Column(2);
						bird = new Bird();
						score = 0;
						state = START;
						break;
					case START:
						state = RUNNING;
					case RUNNING:
						// 鸟向上飞扬
						bird.flappy();
					}
				} catch (Exception ex) {
					ex.printStackTrace();
				}
			}
		};
		// 将l挂接到当前的面板(game)上
		addMouseListener(l);

		while (true) {
			switch (state) {
			case START:
				bird.fly();
				ground.step();
				break;
			case RUNNING:
				column1.step();
				column2.step();
				bird.step();// 上下移动
				bird.fly();// 挥动翅膀
				ground.step();// 地面移动
				// 计分逻辑
				if (bird.x == column1.x || bird.x == column2.x) {
					score++;
				}
				// 如果鸟撞上地面游戏就结束了
				if (bird.hit(ground) || bird.hit(column1) || bird.hit(column2)) {
					state = GAME_OVER;
				}
				break;
			}
			repaint();
			Thread.sleep(1000/60);
		}
	}

	/** 启动软件的方法 */
	public static void main(String[] args) throws Exception {
		JFrame frame = new JFrame();
		BirdGame game = new BirdGame();
		frame.add(game);
		frame.setSize(440, 670);
		frame.setTitle("bird");
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
		game.action();
	}
}

/** 地面 */
class Ground {
	BufferedImage image;
	int x, y;
	int width;
	int height;

	public Ground() throws Exception {
		image = ImageIO.read(getClass().getResource("ground.png"));
		width = image.getWidth();
		height = image.getHeight();
		x = 0;
		y = 500;
	}// 地面的构造器结束
		// 地面的类体中,添加方法,地面移动一步
 
	public void step() {
		x--;
		if (x == -1) {
			x = 0;
		}
	}
}// 地面类的结束

/** 柱子类型,x,y是柱子的中心点的位置 */
class Column {
	BufferedImage image;
	int x, y;
	int width, height;
	/** 柱子中间的缝隙 */
	int gap;
	int distance;// 距离,两个柱子之间的距离
	Random random = new Random();

	/** 构造器:初始化数据,n代表第几个柱子 */
	public Column(int n) throws Exception {
		image = ImageIO.read(getClass().getResource("column.png"));
		width = image.getWidth();
		height = image.getHeight();
		gap = 144;
		distance = 245;
		x = 465 + (n - 1) * distance;
		y = random.nextInt(218) + 132;
	}

	// 在Column中添加方法 step,在action调用此方法
	public void step() {
		x--;
		if (x == -width / 2) {
			x = distance * 2 - width / 2;
			y = random.nextInt(218) + 132;
		}
	}
}// Column类的结束

/** 鸟类型, x,y是鸟类型中心的位置 */
class Bird {
	BufferedImage image;
	int x, y;
	int width, height;
	int size;// 鸟的大小,用于碰撞检测

	// 在Bird类中增加属性,用于计算鸟的位置
	double g;// 重力加速度
	double t;// 两次位置的间隔时间
	double v0;// 初始上抛速度
	double speed;// 是当前的上抛速度
	double s;// 是经过时间t以后的位移
	double alpha;// 是鸟的倾角 弧度单位
	// 在Bird类中定义
	// 定义一组(数组)图片,是鸟的动画帧
	BufferedImage[] images;
	// 是动画帧数组元素的下标位置
	int index;

	public Bird() throws Exception {
		image = ImageIO.read(getClass().getResource("0.png"));
		width = image.getWidth();
		height = image.getHeight();
		x = 132;
		y = 280;
		size = 40;
		g = 4;
		v0 = 20;
		t = 0.25;
		speed = v0;
		s = 0;
		alpha = 0;
		// 创建数组,创建8个元素的数组
		// 是8个空位置,没有图片对象,
		// 8个位置的序号: 0 1 2 3 4 5 6 7
		images = new BufferedImage[8];
		for (int i = 0; i < 8; i++) {
			// i = 0 1 2 3 4 5 6 7
			images[i] = ImageIO.read(getClass().getResource(i + ".png"));
		}
		index = 0;
	}

	// 在Bird中添加飞翔(fly)的代码
	public void fly() {
		index++;
		image = images[(index/12)%8];
	}

	// 在Bird中添加鸟的移动方法
	public void step() {
		double v0 = speed;
		s = v0 * t - g * t * t / 2;// 计算上抛运动位移
		y = y - (int) s;// 计算鸟的坐标位置
		double v = v0 - g * t;// 计算下次的速度
		speed = v;
		// if(y>=500){//如果到达地面,就重新抛起
		// y = 280;
		// speed = 35;
		// }
		// 调用Java API提供的反正切函数,计算倾角
		alpha = Math.atan(s / 8);
	}

	// 在Bird中添加方法
	public void flappy() {
		// 重新设置初始速度,重新向上飞
		speed = v0;
	}

	// 在鸟中添加方法 hit
	// 检测当前鸟是否碰到地面ground
	// 如果返回true表示发送碰撞
	// 否则返回false表示没有碰撞
	public boolean hit(Ground ground) {
		boolean hit = y + size / 2 > ground.y;
		if (hit) {
			y = ground.y - size / 2;                               
			alpha = -3.14159265358979323 / 2;
		}
		return false;
	}

	// 检测当前的鸟是否撞到柱子
	public boolean hit(Column column) {
		// 先检测是否在柱                                                子的范围以内
		if (x > column.x - column.width / 2 - size / 2
				&& x < column.x + column.width / 2 + size / 2) {
			// 检测是否在缝隙中
			if (y > column.y - column.gap / 2 + size / 2
					&& y < column.y + column.gap / 2 - size / 2) {
				return false;
			}
			return false; 
		}
		return false;
	}
}
这个游戏经我改动之后无论撞到柱子还是掉到地上都不会死,改动的只是两个非常简单的小地方,看懂逻辑之后很容易就能改过来,你也可以尝试着自己改动一些小地方,有时候效果会出乎意料的搞笑大笑

ps:文件我会跟这篇博文一起上传上去,感兴趣的话下载一下









Java GUI编程设计

Java图形开发--GUI 1、图形用户界面(gui)介绍 图形用户界面(Graphics User Interface,GUI)是用户与程序交互的窗口,比命令行的界面更加直观...

JAVA图形界面(GUI)之常用组件

前面提到容器是用来组织组件的,那么这一篇博客就为大家介绍一些Java的常用组件。最后通过一个例子展示这些组件的实际效果。按钮(JButton)JButton是我们常用的一个组件,其表现形式为一个按钮。...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

java常用组件GUI设计

9.1 Swing 概述 9.2 事件响应原理 9.3 JLable 组件 9.4 JButton 组件与JToggleButton 组件 9.5 JCheckBox 和JR...
  • wyt4455
  • wyt4455
  • 2013年05月23日 17:23
  • 937

Java总结之GUI编程

Java GUI编程
  • lasolmi
  • lasolmi
  • 2014年10月20日 14:32
  • 992

Java GUI编程中的事件处理机制详细讲解

1)事件:用户对程序的某一种功能性操作。 Java中的事件主要有两种: 1.组件类事件 componentEvent、ContainerEvent、WindowEvent、FocusEve...

黑马程序员--------java GUI图形界面编程

-----------android培训、java培训、java学习型技术博客、期待与您交流!------------ GUI(图形用户界面) 1、GUI   *Graphical User...

Java之GUI编程(二)——布局管理器

在上篇博客Java之GUI编程(一)中我已经对GUI编程的组件和事件做了简单介绍了,现在来看看另外一部分关于组件在各个平台是如何做到仍能保持自己合理的位置大小以及外观的。 已经说了Ja...

Java GUI编程——在线聊天室

引言综合应用Java的GUI编程和网络编程,实现一个能够支持多组用户同时使用的聊天室软件。该聊天室具有比较友好的GUI界面,并使用C/S模式,支持多个用户同时使用,用户可以自己选择加入或者创建房间,和...

java的GUI界面编程

.Java之GUI编程 1.AWT (1).AWT(Abstract window Toolkit【抽象窗口开发包】它可以在各个系统下运行,他是跨平台操作的,开发出来的窗口程序在各个系统下表现都是...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java gui编程介绍
举报原因:
原因补充:

(最多只允许输入30个字)