文章目录
- 01、java图形绘制
- 1.1、画图
- 画一个笑脸
- 1.2、字体Font
- 在窗体中央输出“欢迎您!”
- 1.3、颜色控制
- 绘制一个方框随即跳动
- 方法一:XOR异或擦除
- 1.4、绘制图像
- 1.4.1、图片自动播放程序设计
- 1.4.2、绘制随机产生若干火柴
- 02、java2D绘图
- 03、图形界面编程
- 例1:编写一个窗体应用,窗体中安排2个按钮,一个叫“改背景”,另一个叫“关闭”,点击“改背景”按钮让窗体颜色随机变化,点击“关闭”按钮可关闭窗体。
- 1、界面设计
- 创建窗体:
- 继承办法创建窗体:
- 创建GUI部件--创建按钮
- 事件监听
- (1)、事件源对象的容器作为监听者
- 用内嵌类实现
- 用匿名内嵌类
- 事件适配器类
- 容器和布局管理
- 例1:大小不断递增的9个按钮放入窗体
- 常见GUI部件
- 鼠标事件:MouseEvent
- 测验:
- 1、设有一批英文单词存放在一个数组中,编制一个图形界面程序浏览单词。在界面中安排一个标签显示单词,另有“上一个”、“下一个”两个按钮实现单词的前后翻动。
- 2、编写数字的英文单词显示程序,窗体中安排一个文本框、一个按钮和一个标签,从文本框输入一个数字(0~9),点击按钮将其对应的英文单词(如:zero、one、two等)显示在标签中。
- 3、,用随机产生的颜色更改窗体的背景,点击“关闭”按钮可关闭窗体。
01、java图形绘制
1.1、画图
画一个笑脸
import java.awt.Canvas;
import java.awt.Frame;
import java.awt.Graphics;
//public class Hello2 extends Canvas {//在画布中绘图,后面输出需要将画布导入窗体
public class Hello2 extends Frame {//直接在窗体中绘图
public void paint(Graphics g) {
g.drawString("forever happy!", 50, 30);
g.drawOval(60, 60, 200, 200);
g.fillOval(90, 120, 50, 20);
g.fillOval(190, 120, 50, 20);
g.drawLine(165, 125, 165, 175);
g.drawLine(165, 175, 150, 160);
g.drawArc(110, 130, 95, 95, 0, -180);
}
public static void main(String arg[]){
Frame x = new Hello2();
//Frame x = new Frame();//画布加入窗体中
//x.add(new Hello2());
x.setSize(300, 300);
x.setVisible(true);
}
}
输出结果:
- 在画布中画图,然后将画布导入窗体:
- 直接在窗体中画图(可以发现没有输出字体,因为在窗体中画图上面默认是给菜单的。)
1.2、字体Font
在窗体中央输出“欢迎您!”
import java.awt.Canvas;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Frame;
import java.awt.Graphics;
public class Hello2 extends Canvas {//在画布中绘图,后面输出需要将画布导入窗体
public void paint(Graphics g)
{
String str = "欢迎您!";
Font f = new Font("黑体",Font.PLAIN,24);
g.setFont(f);
FontMetrics fm = getFontMetrics(f);
int x = (getWidth() - fm.stringWidth(str)) / 2;
int y = getHeight() / 2;
g.drawString(str, x, y);
}
public static void main(String arg[]){
Frame x = new Frame();
x.add(new Hello2());//画布加入窗体中
x.setSize(300, 150);
x.setVisible(true);
}
}
输出结果:
1.3、颜色控制
绘制一个方框随即跳动
方法一:XOR异或擦除
import java.awt.*;
public class Hello2 extends Frame {//在画布中绘图,后面输出需要将画布导入窗体
int x=35, y=35, size=35;
public void init() {
Graphics g=getGraphics();
g.setXORMode(getBackground());
g.setColor(Color.blue);
for(;;) {
g.fillRect(x, y, size, size);//擦除位置
x = 40 + (int)(Math.random()*60);
y = 40 + (int)(Math.random()*60);
g.fillRect(x, y, size, size);//绘制新位置
try { Thread.sleep(1000);//延时1s
} catch(InterruptedException e) {}
}
}
public void paint(Graphics g) {//绘制小矩形框
g.setColor(Color.blue);
g.fillRect(x, y, size, size);
}
public static void main(String arg[]){
Hello2 f = new Hello2();
f.setSize(300, 200);
f.setVisible(true);
f.init();
}
}
输出结果:
1.4、绘制图像
1.4.1、图片自动播放程序设计
import java.awt.*;
public class Hello2 extends Frame {//在画布中绘图,后面输出需要将画布导入窗体
Image[] imgs;//保存图片序列的Image数组
int totalImages = 5;//图片序列中的图片总数5
int currentImage = 0;//当前时刻应该显示图片序号
public Hello2() {
imgs = new Image[totalImages];
Toolkit toolkit = getToolkit();
for(int i=0; i<totalImages; i++)//获取所有图像文件
imgs[i] = toolkit.getImage( "E:\\picture\\" + i + ".gif");
}
public void paint(Graphics g) {
while(true) {
g.drawImage(imgs[currentImage], 20, 40, this);
System.out.print(currentImage);
currentImage = ++currentImage % totalImages;
System.out.print(currentImage);
try {
Thread.sleep(500);//延时半秒钟
}catch(InterruptedException e) { }
}
}
public static void main(String arg[]){
Frame f = new Hello2();
f.setSize(300,300);
f.setVisible(true);
}
}
1.4.2、绘制随机产生若干火柴
import java.awt.*;
public class Hello2 extends Canvas {//在画布中绘图,后面输出需要将画布导入窗体
Image img;//火柴图像
int sx=10, sy=10;//第一根火柴左上角位置
int w=6;//火柴宽度
public void init() {//图像缓冲区
img = createImage(6, 30);//用于绘制 1根火柴
Graphics g=img.getGraphics();//得到画笔
g.setColor(Color.orange);//设置画笔颜色
g.fillRect(0, 0, 6, 25);//火柴杆
g.setColor(Color.red);
g.fillRect(0, 25, 6, 5);//火柴头
}
public void paint(Graphics g) {
int x=5 + (int)(Math.random()*15);
for(int k=0; k<x; k++)
g.drawImage(img, sx+k*(2+w),sy,this);
}
public static void main(String arg[]){
Frame me = new Frame();
Hello2 p =new Hello2();
me.add(p);//将窗体加入画布
me.setSize(300, 200);
me.setVisible(true);
p.init();
p.repaint();
}
}
输出结果:
02、java2D绘图
03、图形界面编程
例1:编写一个窗体应用,窗体中安排2个按钮,一个叫“改背景”,另一个叫“关闭”,点击“改背景”按钮让窗体颜色随机变化,点击“关闭”按钮可关闭窗体。
1、界面设计
两种GUI部件:
创建窗体:
import java.awt.*;
public class Hello2 {
public static void main(String args[]) {
Frame f=new Frame("测试");
f.setSize(400,200);
f.setVisible(true);
}
}
运行结果:
继承办法创建窗体:
public class Hello2 extends Frame {
public Hello2() {
super("测试");
setSize(400,200);
setVisible(true);
}
public static void main(String args[]) {
new Hello2();
}
}
创建GUI部件–创建按钮
public class Hello2 extends Frame {
public Hello2() {
super("测试");
Button btn1 = new Button("改背景");//设置按钮格式
Font f = new Font("宋体",Font.BOLD,28);
btn1.setFont(f);
setLayout(new FlowLayout());
add(btn1);//添加按钮
setSize(400,200);
setVisible(true);
}
public static void main(String args[]) {
new Hello2();
}
}
事件监听
(1)、事件源对象的容器作为监听者
public class Hello2 extends Frame implements ActionListener {
public Hello2() {
super("测试");
Button btn1 = new Button("改背景");//设置按钮格式
Font f = new Font("宋体",Font.BOLD,28);
btn1.setFont(f);
setLayout(new FlowLayout());
add(btn1);//添加按钮
btn1.addActionListener(this);
setSize(400,200);
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
int c1 = (int)(Math.random()*256);
int c2 = (int)(Math.random()*256);
int c3 = (int)(Math.random()*256);
setBackground(new Color(c1,c2,c3));
}
public static void main(String args[]) {
new Hello2();
}
}
点击“改背景”按钮:背景颜色将会发生改变
用内嵌类实现
public class Hello2 extends Frame implements ActionListener {
public Hello2() {
super("测试");
Button btn1 = new Button("改背景");//设置按钮格式
Button btn2 = new Button("关闭");
Font f = new Font("宋体",Font.BOLD,28);
btn1.setFont(f);
btn2.setFont(f);
setLayout(new FlowLayout());
add(btn1);//添加按钮
btn1.addActionListener(this);
add(btn2);//添加按钮
btn2.addActionListener(new Process());
setSize(400,200);
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
int c1 = (int)(Math.random()*256);
int c2 = (int)(Math.random()*256);
int c3 = (int)(Math.random()*256);
setBackground(new Color(c1,c2,c3));
}
class Process implements ActionListener {
public void actionPerformed(ActionEvent e) {
dispose();
}
}
public static void main(String args[]) {
new Hello2();
}
}
点击关闭,窗口将会关闭
用匿名内嵌类
事件适配器类
容器和布局管理
例1:大小不断递增的9个按钮放入窗体
方法一:FlowLayout布局
import java.awt.*;
public class Hello2 extends Frame {
public Hello2() {
super("测试");
setSize(400,200);
setVisible(true);
setLayout(new FlowLayout(FlowLayout.LEFT,10,10));
String spaces = "";//用来使按钮的大小变化
for(int i = 1; i <= 9; i++) {
add(new Button("B #" + i + spaces));
spaces += " ";
}
}
public static void main(String args[]) {
new Hello2();
}
}
方法二:GridLayout布局
import java.awt.*;
public class Hello2 extends Frame {
public Hello2() {
super("测试");
setSize(400,200);
setVisible(true);
setLayout(new GridLayout(4,4,10,10));
for(int i = 1; i <= 9; i++) {
add(new Button("B #" + i));
}
}
public static void main(String args[]) {
new Hello2();
}
}
如下图,按钮的宽度将会随着窗体的宽度变化
常见GUI部件
鼠标事件:MouseEvent
共有7中情形,用MouseEvent类的同名静态整型常量标志,分别是:
测验:
1、设有一批英文单词存放在一个数组中,编制一个图形界面程序浏览单词。在界面中安排一个标签显示单词,另有“上一个”、“下一个”两个按钮实现单词的前后翻动。
import java.awt.*;
import java.awt.event.*;
public class Hello2 extends Frame implements ActionListener {
Label res;
int count=0;
String word[] = {"zero","one","two","three","four","five","six","seven","eight","nine"};
int len = word.length;
public Hello2() {
res=new Label(" 显示英文单词 ");
setLayout(new FlowLayout());
add(res);
Button btn1 = new Button("上一个");//设置按钮格式
Button btn2 = new Button("下一个");//设置按钮格式
add(btn1);add(btn2);
btn1.addActionListener(this);
btn2.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("下一个"))//区分用户点击的是哪一个按钮
count++;
else {
if(count==0) count=9;
else count--;
}
count = count % len;
res.setText(word[count]);
}
public static void main(String args[]) {
Frame my=new Hello2();
my.setSize(300,300);
my.setVisible(true);
}
}
输出结果:
2、编写数字的英文单词显示程序,窗体中安排一个文本框、一个按钮和一个标签,从文本框输入一个数字(0~9),点击按钮将其对应的英文单词(如:zero、one、two等)显示在标签中。
代码示例;
import java.awt.*;
import java.awt.event.*;
public class Hello2 extends Frame implements ActionListener {
Label res;
TextField my;
String word[] = {"zero","one","two","three","four","five","six","seven","eight","nine","ten"};
public Hello2() {
my=new TextField(20);
res=new Label("英文单词 ");
Button btn1 = new Button("显示单词");//设置按钮格式
setLayout(new FlowLayout());
add(my);add(res);
add(btn1);
btn1.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
String s=my.getText();
int n=Integer.parseInt(s);
res.setText(word[n]);
}
public static void main(String args[]) {
Frame my=new Hello2();
my.setSize(300,300);
my.setVisible(true);
}
}
输出结果:
3、,用随机产生的颜色更改窗体的背景,点击“关闭”按钮可关闭窗体。
代码示例;
import java.awt.event.*;
import java.awt.*;
public class Hello2 extends Frame implements ActionListener {
public Hello2() {
super("测试");
Button btn1 = new Button("改背景");//设置按钮格式
Button btn2 = new Button("关闭");
Font f = new Font("宋体",Font.BOLD,28);
btn1.setFont(f);
btn2.setFont(f);
setLayout(new FlowLayout());
add(btn1);//添加按钮
btn1.addActionListener(this);
add(btn2);//添加按钮
btn2.addActionListener(new Process());
setSize(400,200);
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
int c1 = (int)(Math.random()*256);
int c2 = (int)(Math.random()*256);
int c3 = (int)(Math.random()*256);
setBackground(new Color(c1,c2,c3));
}
class Process implements ActionListener {
public void actionPerformed(ActionEvent e) {
dispose();
}
}
public static void main(String args[]) {
new Hello2();
}
}
输出结果: