04747_Java语言程序设计(一)_第7章_图形、图像与多媒体

 

例7.1小应用程序用6种字型显示字符串,显示内容说明本身的字型。

 

import java.applet.*;
import java.awt.*;

public class Example7_1 extends Applet {
	Font f1 = new Font("Helvetica", Font.PLAIN, 18);
	Font f2 = new Font("Helvetica", Font.BOLD, 10);
	Font f3 = new Font("Helvetica", Font.ITALIC, 12);
	Font f4 = new Font("Courier", Font.PLAIN, 12);
	Font f5 = new Font("TimesRoman", Font.BOLD + Font.ITALIC, 14);
	Font f6 = new Font("Dialog", Font.ITALIC, 14);

	public void paint(Graphics g) {
		setSize(250, 200);
		g.setFont(f1);
		g.drawString("18pt plain Helvetica", 5, 20);
		g.setFont(f2);
		g.drawString("10pt bold helvetica", 5, 43);
		g.setFont(f3);
		g.drawString("12pt italic Helvetica", 5, 58);
		g.setFont(f4);
		g.drawString("12pt plain courier", 5, 75);
		g.setFont(f5);
		g.drawString("14pt bold & italic Times Roman", 5, 92);
		g.setFont(f6);
		g.drawString("14pt italic Dialog", 5, 111);
	}
}

 

例7.2小应用程序设置颜色并涂方块,其中绘制方块的方法参见7.2节。

 

import java.applet.*;
import java.awt.*;

public class Example7_2 extends Applet {
	public void paint(Graphics g) {
		setSize(380, 200);
		for (int i = 0; i <= 10; i++) {
			Color myredcolor = new Color(i * 25 + 5, 0, 0);
			g.setColor(myredcolor);
			g.fillRect(i * 32 + 5, 2, 28, 28);// 用指定的颜色填充方块
		}
		for (int i = 0; i <= 10; i++) {
			Color mygreencolor = new Color(0, i * 25 + 5, 0);
			g.setColor(mygreencolor);
			g.fillRect(i * 32 + 5, 32, 28, 28);// 用指定的颜色填充方块
		}
		for (int i = 0; i <= 10; i++) {
			Color mybluecolor = new Color(0, 0, i * 25 + 5);
			g.setColor(mybluecolor);
			g.fillRect(i * 32 + 5, 62, 28, 28);// 用指定的颜色填充方块
		}
	}
}

 

例7.3小应用程序重写update()方法,只清除圆块,不清除文字。窗口显示一个不断移动的红色方块。

 

import java.applet.*;
import java.awt.*;

public class Example7_3 extends Applet {
	int i = 1;

	public void init() {
		setBackground(Color.yellow);
	}

	public void paint(Graphics g) {
		i = i + 8;
		if (i > 160) {
			i = 1;
		}
		g.setColor(Color.red);
		g.fillRect(i, 10, 20, 20);
		g.drawString("我正在学习update()方法!", 100, 100);
		try {
			Thread.sleep(100);// 程序暂停0.1秒
		} catch (InterruptedException e) {
		}
		repaint();
	}

	public void update(Graphics g) {
		g.clearRect(i, 10, 200, 100);// "我正在学习update()方法!"
		paint(g);
	}
}

 

例7.4使用XOR绘图模式的应用程序。

 

import java.awt.*;
import javax.swing.*;

public class Example7_4 extends JFrame {
	public static void main(String args[]) {
		GraphicsDemo myGraphicsFrame = new GraphicsDemo();
	}
}

class ShapesPanel extends JPanel {
	ShapesPanel() {
		setBackground(Color.white);
	}

	public void paintComponet(Graphics g) {
		super.paintComponent(g);
		setBackground(Color.yellow);// 背景色为黄色
		g.setXORMode(Color.red);// 设置XOR绘图模式,颜色为红色
		g.setColor(Color.green);
		g.fillRect(20, 20, 80, 40);// 实际颜色是green+yellow的混合色=灰色。
		g.setColor(Color.yellow);
		g.fillRect(60, 20, 80, 40);/* 后一半是yellow+yellow=red,前一半是yellow+灰色 */
		g.setColor(Color.green);
		g.fillRect(20, 70, 80, 40);// 实际颜色是green+yellow的混合色=灰色。
		g.fillRect(60, 70, 80,
				40);/*
					 * 前一半是(green+yellow)+灰色=背景色 后一半是green+yellow=灰色
					 */
		g.setColor(Color.green);
		g.fillRect(80, 100, 180, 200);// 该直线式green+yellow=灰色。
		g.fillRect(100, 100, 200, 200);// 该直线式green+yellow=灰色。
		/*
		 * 再绘制部分重叠的直线。原直线中间段是灰色+灰色=背景色, 延长部分是green+yellow=灰色。
		 */
		g.drawLine(140, 140, 220, 220);
		g.setColor(Color.yellow);// 分析下列直线颜色变化,与早先的图有重叠
		g.fillRect(20, 30, 160, 30);
		g.fillRect(20, 75, 160, 75);
	}
}

class GraphicsDemo extends JFrame {
	public GraphicsDemo() {
		this.getContentPane().add(new ShapesPanel());
		setTitle("基本绘图方法演示");
		setSize(300, 300);
		setVisible(true);
	}
}

 

例7.5小应用程序用init()或start()方法下载(获取)图像,用paint()方法显示得到的图像。

 

import java.applet.*;
import java.awt.*;

public class Example7_5 extends Applet {
	Image myImg;

	public void start() {
		myImg = getImage(getCodeBase(), "myPic.jpg");
	}

	public void print(Graphics g) {
		g.drawImage(myImg, 2, 2, this);
	}
}

 

例7.6小应用程序演示图像缓冲显示技术。

 

import java.applet.*;
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
import java.awt.event.*;

public class Example7_6 extends Applet {
	Image myPicture;

	/*
	 * init()方法中,先定义一个Image对象,并赋予createImage()方法的返回值,接着创建
	 * Graphics对象并赋予其图形环境。最后,让Graphics对象调用drawImage()方法显示图像。
	 * 由于这里的Graphics对象offScreenGc是非屏幕对象,小程序窗口不会有图像显示
	 */
	public void init() {
		myPicture = getImage(getCodeBase(), "myPic.JPG");
		Image offScreenImage = createImage(size().width, size().height);
		Graphics offScreenGc = offScreenImage.getGraphics();
		offScreenGc.drawImage(myPicture, 0, 0, this);
		new BufferedDemo(myPicture);
	}

	/*
	 * drawImage()方法的第四个参数是实现imageObserver接口,在init()方法中,调用
	 * drawImage()方法的参数是this,所以小程序要定义imageUpdate()方法
	 */
	public boolean imageUpdate(Image img, int infoFlg, int x, int y, int w, int h) {
		if (infoFlg == ALLBITS) {
			repaint();
			return false;
		} else {
			return true;
		}
	}
}

/*
 * 程序的执行过程是,当小程序调用drawImage()方法时,drawImage()方法将创建一个
 * 调用imageUpdate()方法的线程,在imageUpdate()方法中,测定图像是否已经已大部分调用内
 * 存。创建的线程不断调用imageUpdate()方法,直到该方法返回false为止。参数infoFlg使
 * 小程序能知道图像装入内容的情况。当infoFlg等于ALLBITS时,表示图像已全部装入内存。
 * 当该方法发现图像已全部装入后,置imageLoaded为真,并调用repaint()方法重画小程序
 * 窗口。方法返回false防止线程再次调用imageUpdate()方法。
 */
class BufferedDemo extends JFrame {
	public BufferedDemo(Image img) {
		this.getContentPane().add(new PicPanel(img));
		setTitle("双缓冲技术演示");
		setSize(300, 300);
		setVisible(true);
	}
}

class PicPanel extends JPanel implements MouseListener, MouseMotionListener {
	int x = 0, y = 0, dx = 0, dy = 0;
	BufferedImage bimg1, bimg2;
	boolean upState = true;

	public PicPanel(Image img) {
		this.setBackground(Color.white);
		this.addMouseListener(this);
		this.addMouseMotionListener(this);
		bimg1 = new BufferedImage(img.getWidth(this), img.getHeight(this), BufferedImage.TYPE_INT_ARGB);
		bimg2 = new BufferedImage(img.getWidth(this), img.getHeight(this), BufferedImage.TYPE_INT_ARGB);
		Graphics2D g2D1 = bimg1.createGraphics();
		Graphics2D g2D2 = bimg2.createGraphics();
		g2D1.drawImage(img, 0, 0, this);
		g2D2.drawImage(img, 0, 0, this);
		g2D2.drawRect(1, 1, img.getWidth(this) - 3, img.getHeight(this) - 3);
	}

	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		Graphics2D g2D = (Graphics2D) g;
		if (upState) {
			g2D.drawImage(bimg1, x, y, this);
		} else {
			g2D.drawImage(bimg2, x, y, this);
		}
	}

	public void mousePressed(MouseEvent e) {
		if (e.getX() >= x && e.getX() < x + bimg1.getWidth(this) && e.getY() >= y
				&& e.getY() < y + bimg1.getHeight(this)) {
			upState = false;
			setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
			dx = e.getX() - x;
			dy = e.getY() - y;
			repaint();
		}
	}

	public void mouseExited(MouseEvent e) {
	}

	public void mouseClicked(MouseEvent e) {
	}

	public void mouseEntered(MouseEvent e) {
	}

	public void mouseReleased(MouseEvent e) {
		this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
		upState = true;
		repaint();
	}

	public void mouseMoved(MouseEvent e) {
	}

	public void mouseDragged(MouseEvent e) {
		if (!upState) {
			x = e.getX() - dx;
			y = e.getY() - dy;
			repaint();
		}
	}
}

 

例7.7小应用程序先将幻灯片读入数组中存储,单击鼠标变换幻灯片,逐张显示。

 

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class Example7_7 extends Applet implements MouseListener {
	final int number = 50;// 假定幻灯片有50张
	int count = 0;
	Image[] card = new Image[number];

	public void init() {
		addMouseListener(this);
		for (int i = 0; i < number; i++) {
			card[i] = getImage(getCodeBase(), "DSC0033" + i + ".jpg");
		}
	}

	public void paint(Graphics g) {
		if ((card[count]) != null) {
			g.drawImage(card[count], 10, 10, card[count].getWidth(this), card[count].getHeight(this), this);
		}
	}

	public void mousePressed(MouseEvent e) {
		count = (count + 1) % number;// 循环逐张显示
		repaint();
	}

	public void mouseReleased(MouseEvent e) {
	}

	public void mouseEntered(MouseEvent e) {
	}

	public void mouseExited(MouseEvent e) {
	}

	public void mouseClicked(MouseEvent e) {
	}
}

 

例7.8小应用程序说明播放动画的方法。

 

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class Example7_8 extends Applet implements Runnable {
	final int number = 50;
	int count = 0;
	Thread mythread;
	Image[] pic = new Image[number];

	public void init() {
		setSize(300, 200);
		for (int i = 1; i <= number; i++) {// 载入动画图片
			pic[i - 1] = getImage(getCodeBase(), "DSC0033" + i + ".jpg");
		}
	}

	public void start() {
		mythread = new Thread(this);// 创建一个线程
		mythread.start();// 启动线程执行
	}

	public void stop()// 结束线程执行
	{
		mythread = null;
	}

	public void run()// 线程的执行代码
	{
		while (true) {
			repaint();
			count = (count + 1) % number;// 改变显的图片号
			try {
				mythread.sleep(200);
			} catch (InterruptedException e) {
			}
		}
	}

	public void paint(Graphics g) {
		if ((pic[count]) != null) {
			g.drawImage(pic[count], 10, 10, pic[count].getWidth(this), pic[count].getHeight(this), this);
		}
	}
}

 

例7.9能播放声音的小应用程序。

 

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class Example7_9 extends Applet implements ActionListener {
	AudioClip clip;// 声明一个音频对象
	Button buttonPlay, buttonLoop, buttonStop;

	public void init() {
		clip = getAudioClip(getCodeBase(), "2.wav");
		// 根据程序所在的地址处的声音文件2.wav创建音频对象,
		// Applet类的getCodeBase()方法可以获得小程序所在的html页面的URL地址。
		buttonPlay = new Button("开始播放");
		buttonLoop = new Button("循环播放");
		buttonStop = new Button("停止播放");
		buttonPlay.addActionListener(this);
		buttonLoop.addActionListener(this);
		buttonStop.addActionListener(this);
		add(buttonPlay);
		add(buttonLoop);
		add(buttonStop);
	}

	public void stop() {
		clip.stop();// 当离开此页面时停止播放。
	}

	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == buttonPlay) {
			clip.play();
		} else if (e.getSource() == buttonLoop) {
			clip.loop();
		}
		if (e.getSource() == buttonStop) {
			clip.stop();
		}
	}
}

 

转载于:https://www.cnblogs.com/denggelin/p/6241847.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值