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();
}
}
}
04747_Java语言程序设计(一)_第7章_图形、图像与多媒体的更多相关文章
- ArcGIS for Desktop入门教程_第七章_使用ArcGIS进行空间分析 - ArcGIS知乎-新一代ArcGIS问答社区
原文:ArcGIS for Desktop入门教程_第七章_使用ArcGIS进行空间分析 - ArcGIS知乎-新一代ArcGIS问答社区 1 使用ArcGIS进行空间分析 1.1 GIS分析基础 G ...
- ArcGIS for Desktop入门教程_第六章_用ArcMap制作地图 - ArcGIS知乎-新一代ArcGIS问答社区
原文:ArcGIS for Desktop入门教程_第六章_用ArcMap制作地图 - ArcGIS知乎-新一代ArcGIS问答社区 1 用ArcMap制作地图 作为ArcGIS for Deskto ...
- ArcGIS for Desktop入门教程_第四章_入门案例分析 - ArcGIS知乎-新一代ArcGIS问答社区
原文:ArcGIS for Desktop入门教程_第四章_入门案例分析 - ArcGIS知乎-新一代ArcGIS问答社区 1 入门案例分析 在第一章里,我们已经对ArcGIS系列软件的体系结构有了一 ...
- 04747_Java语言程序设计(一)_第3章_面向对象编程基础
链式编程 每次调用方法后,返回的是一个对象 /* * 链式编程 * 每次调用方法后,返回的是一个对象 */ class Student { public void study() { System.o ...
- 04747_Java语言程序设计(一)_第1章_Java语言基础
二进制0b开头 八进制0开头 十六进制0x开头 package com.jacky; public class Aserver { public static void main(String arg ...
- 04747_Java语言程序设计(一)_第10章_网络与数据库编程基础
例10.1说明InetAddress类的用法的应用程序. public class Example10_1 { public static void main(String args[]) { try ...
- 04747_Java语言程序设计(一)_第9章_输入和输出流
例9.1一个文件复制应用程序,将某个文件的内容全部复制到另一个文件. import java.io.*; public class Example9_1 { public static void ma ...
- 04747_Java语言程序设计(一)_第8章_多线程
例8.1应用程序用Thread子类实现多线程. import java.util.Date; public class Example8_1 { static Athread threadA; sta ...
- 04747_Java语言程序设计(一)_第6章_图形界面设计(二)
例6.1声明一个面板子类,面板子类对象有3个选择框. class Panel1 extends JPanel { JCheckBox box1, box2, box3; Panel1() { box1 ...
随机推荐
- Ubuntu 无线连接能上网,但是有线连接不能上
这两天装Ubuntu,遇到小问题.最头疼的还是上网,过去我装了Ubuntu时,都是插上网线就能直接上网,这次就不行了. 我刚点开一个网页,接下来点就不能上了,但是无线连接就可以正常上网. 我在一个论坛 ...
- QlikView实现部分载入数据的功能(Partial Load)
问题背景: 一直非常想不通,公司花了N多钱请了一帮QlikView的Consultant做出来的solution居然没有涉及Reload的部分,以至于每次刷新数据都须要刷新整个Data Model,之 ...
- Hadoop集群运行JNI程序
要在Hadoop集群运行上运行JNI程序,首先要在单机上调试程序直到可以正确运行JNI程序,之后移植到Hadoop集群就是水到渠成的事情. Hadoop运行程序的方式是通过jar包,所以我们需要将所有 ...
- Unity发送短信
闲来无事,觉得用uinity来发送短信挺有意思的,所以自己差了点资料,看看能否实现,结果还真的可以!废话不多说,直接码! 1,新建一空工程,我们就简单的使用UGUI搭建一个丑陋的界面吧! 2,界面极其 ...
- 生命周期-初识IOS
经常因为生命周期的事情,而视图顺序加载错误,或者出现一系列的小错误并且修改不出来,程序员不知道生命周期确实挺可悲的. IOS生命周期: 自上而下的执行,并且viewDidLoad只会执行一次,所以我们 ...
- Stm32高级定时器(四)
Stm32高级定时器(四) 1 编码器接口模式 1.1 编码器原理 什么是正交?如果两个信号相位相差90度,则这两个信号称为正交.由于两个信号相差90度,因此可以根据两个信号哪个先哪个后来判断方向.根 ...
- 文本输入框的两种div+css的写法
1.扁平化的设计风格.--淘宝 直接使用input.对其设置height.padding.使鼠标居中又不会占满输入框. 2.背景是图片的设计.--百度 试用span将input包裹 ...
- DropDownList绑定数据
DDLName.DataSource = myRd;DDLName.DataTextField = "name";//要绑定的字段DDLName.DataValueField = ...
- Arc engine - Geodatabase.
Geodatabase以层次结构的数据对象来组织地理数据. 这些数据对象存储在要素类(Feature Classes).对象类(0bject classes)和数据集(Feature datasets ...
- ios面试汇总
http://www.360doc.com/content/15/0707/01/26281448_483232245.shtml