一.绘制图形
eg.创建DrawCircle类,使该类继承JFrame类称为窗口组件,在类中继承JPanel类的DrawPanel内部类,并重写paint() 方法,绘制5个圆形。
package hello;
import java.awt.*;
import javax.swing.*;
public class DrawCircle extends JFrame {
private final int OVAL_WIDTH = 80;// 圆形的宽
private final int OVAL_HEIGHT = 80;// 圆形的高
public DrawCircle() {
super();//调用父类的构造方法,先执行父类方法再执行子类方法
initialize();// 调用初始化方法
}
// 初始化方法
private void initialize() {
this.setSize(300, 200);// 设置窗体大小
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置窗体关闭模式
setContentPane(new DrawPanel());// 设置窗体面板为绘图面板对象
this.setTitle("绘图圆形");// 设置窗体标题
}
public static void main(String[] args) {
new DrawCircle().setVisible(true);
}
// 创建绘图面板
class DrawPanel extends JPanel {
public void paint(Graphics g) {
super.paint(g);
g.drawOval(10, 10, OVAL_WIDTH, OVAL_HEIGHT); // 绘制第1个圆形
g.drawOval(80, 10, OVAL_WIDTH, OVAL_HEIGHT); // 绘制第2个圆形
g.drawOval(150, 10, OVAL_WIDTH, OVAL_HEIGHT); // 绘制第3个圆形
g.drawOval(50, 70, OVAL_WIDTH, OVAL_HEIGHT); // 绘制第4个圆形
g.drawOval(120, 70, OVAL_WIDTH, OVAL_HEIGHT); // 绘制第5个圆形
}
}
}
1.画线段
drawLine(int x1,int y1,int x2,int y2) 在点(x1,y1)与点(x2,y2)之间画线段。
2.画圆弧
drawArc(int x,int y,int width,int height,int startAngle, int arcAngle)
椭圆的中心是它的外接矩形的中心,其中参数是外接矩形的左上角坐标(x,y),宽是width,高是heigh。参数startAngle的单位是 “度”,参数 startAngle 表示开始角度,arcAngle 表示相对于开始角度而言弧跨越的角度。参数 startAngle 表示开始角度,arcAngle 表示相对于开始角度而言弧跨越的角度。正值度数是逆时针方向,负值度数是顺时针方向,例如-90度是6点钟方位。
fillArc(int x,int y,int width, int height, int startAngle, int arcAngle):用setColor()方法设定的颜色,画着色椭圆的一部分。
g.drawArc(100,40,90,50,180,180); // 画圆弧线
g.setColor(Color.yellow); g.fillArc(10,100,40,40,0,-270); // 填充缺右上角的四分之三的椭圆
g.setColor(Color.yellow); g.fillArc(10,100,40,40,0,-270); // 填充缺右上角的四分之三的椭圆
3.画椭圆
drawOval(int x,int y,int width,int height)参数x和y指定椭圆形左上角的位置,参数width和height是横轴和纵轴。
fillOval(int x,int y,int width,int height):是用预定的颜色填充的椭圆形,是一个着色块。
fillOval(int x,int y,int width,int height):是用预定的颜色填充的椭圆形,是一个着色块。
g.drawOval(10,10,60,120);//画椭圆
g.setColor(Color.magenta); g.fillOval(15,140,100,50); // 填充椭圆
4.画矩形
(1)普通矩形
drawRect(int x,int y,int width,int height)参数x和y指定左上角的位置,参数width和height是矩形的宽和高。
g.drawRect(80,100,40,25);//画线框
g.setColor(Color.yellow); g.fillRect(20,70,20,30);//画着色块
(2)圆角矩形
drawRoundRect(int x,int y,int width, int height, int arcWidth, int arcHeight)参数x和y指定矩形左上角的位置;参数width和heigth是矩形的宽和高;arcWidth和arcHeight分别是圆角弧的横向直径和纵向直径。
g.drawRoundRect(10,10,150,70,40,25);//画一个圆角矩形
g.setColor(Color.blue); g.fillRoundRect(80,100,100,100,60,40);//涂一个圆角矩形块
g.setColor(Color.blue); g.fillRoundRect(80,100,100,100,60,40);//涂一个圆角矩形块
(3)三维矩形
draw3DRect(int x,int y,int width,int height, boolean raised) 参数x和y指定矩形左上角的位置,参数width和height是矩形的宽和高,参数raised是突出与否。
fill3DRect(int x,int y,int width,int height,boolean raised):用预定的颜色填充一个突出显示的矩形。
g.draw3DRect(80,100,40,25,true);//画一个线框
g.setColor(Color.yellow); g.fill3DRect(20,70,20,30,true);//画一个着色块
5.画多边形
(1)drawPolygon(int xpoints[],int yPoints[],int nPoints) 数组xPoints[]存储x坐标点,yPoints[]存储y坐标点,nPoints是坐标点个数。
注意,上述方法并不自动闭合多边形,要画一个闭合的多边形,给出的坐标点的最后一点必须与第一点相同.以下代码实现填充一个三角形和画一个八边形。
int px1[]={50,90,10,50};//首末点相重,才能画多边形
int py1[]={10,50,50,10};
int px2[]={140,180,170,180,140,100,110,140};
int py2[]={5,25,35,45,65,35,25,5};
g.setColor(Color.blue); g.fillPolygon(px1,py1,4);
g.setColor(Color.red); g.drawPolygon(px2,py2,9);
注意,上述方法并不自动闭合多边形,要画一个闭合的多边形,给出的坐标点的最后一点必须与第一点相同.以下代码实现填充一个三角形和画一个八边形。
int px1[]={50,90,10,50};//首末点相重,才能画多边形
int py1[]={10,50,50,10};
int px2[]={140,180,170,180,140,100,110,140};
int py2[]={5,25,35,45,65,35,25,5};
g.setColor(Color.blue); g.fillPolygon(px1,py1,4);
g.setColor(Color.red); g.drawPolygon(px2,py2,9);
(2)用多边形对象画多边形。用多边形类Polygon创建一个多边形对象,然后用这个对象绘制多边形。
Polygon():创建多边形对象,暂时没有坐标点。
Polygon(int xPoints[],int yPoints[],int nPoints):用指定的坐标点创建多边形对象。
addPoint():将一个坐标点加入到Polygon对象中。
drawPolygon(Polygon p):绘制多边形。
fillPolygon(Polygon p):和指定的颜色填充多边形。
Polygon(int xPoints[],int yPoints[],int nPoints):用指定的坐标点创建多边形对象。
addPoint():将一个坐标点加入到Polygon对象中。
drawPolygon(Polygon p):绘制多边形。
fillPolygon(Polygon p):和指定的颜色填充多边形。
eg.画一个三角形和填充一个黄色的三角形。注意,用多边形对象画封闭多边形不要求首末点重合。
int x[]={140,180,170,180,140,100,110,100};
int y[]={5,25,35,45,65,45,35,25};
Polygon ponlygon1=new Polygon();
polygon1.addPoint(50,10);
polygon1.addPoint(90,50);
polygon1.addPoint(10,50);
g.drawPolygon(polygon1);
g.setColor(Color.yellow);
Polygon polygon2 = new Polygon(x,y,8);
g.fillPolygon(polygon2);
int x[]={140,180,170,180,140,100,110,100};
int y[]={5,25,35,45,65,45,35,25};
Polygon ponlygon1=new Polygon();
polygon1.addPoint(50,10);
polygon1.addPoint(90,50);
polygon1.addPoint(10,50);
g.drawPolygon(polygon1);
g.setColor(Color.yellow);
Polygon polygon2 = new Polygon(x,y,8);
g.fillPolygon(polygon2);
6.擦除矩形块
当需要在一个着色图形的中间有一个空缺的矩形的情况,可用背景色填充一矩形块实现,相当于在该矩形块上使用了 “橡皮擦”。 clearRect(int x,int y, int width,int height):擦除一个由参数指定的矩形块的着色。
g.setColor(Color.blue); g.fillOval(50,50,100,100); g.clearRect(70,70,40,55);
g.setColor(Color.blue); g.fillOval(50,50,100,100); g.clearRect(70,70,40,55);
7.限定作图显示区域
用一个矩形表示图形的显示区域,要求图形在指定的范围内有效,不重新计算新的坐标值,自动实现超出部分不显示 clipRect(int x,int y,int width,int height)
g.clipRect(0,0,100,50); g.clipRect(50,25,100,50); 相当于g.clipRect(50,25,50,25);
g.clipRect(0,0,100,50); g.clipRect(50,25,100,50); 相当于g.clipRect(50,25,50,25);
8.复制图形
利用Graphics类的方法copyArea()可以实现图形的复制,其使用格式是:
copyArea(int x,int y,int width,int height, int dx, int dy),dx和dy分别表示将图形粘贴到原位置偏移的像素点数,正值为往右或往下偏移是,负值为往左或往上偏移量。位移的参考点是要复制矩形的左上角坐标。
例如,以下代码示意图形的复制,将一个矩形的一部分、另一个矩形的全部分别自制。
g.drawRect(10,10,60,90);
g.fillRect(90,10,60,90);
g.copyArea(40,50,60,70,-20,80);
g.copyArea(110,50,60,60,10,80);
copyArea(int x,int y,int width,int height, int dx, int dy),dx和dy分别表示将图形粘贴到原位置偏移的像素点数,正值为往右或往下偏移是,负值为往左或往上偏移量。位移的参考点是要复制矩形的左上角坐标。
例如,以下代码示意图形的复制,将一个矩形的一部分、另一个矩形的全部分别自制。
g.drawRect(10,10,60,90);
g.fillRect(90,10,60,90);
g.copyArea(40,50,60,70,-20,80);
g.copyArea(110,50,60,60,10,80);
要想绘制指定形状的图形,需要先创建并初始化该图形类的对象,这些图形类必须是Shape接口的实现类。语法为 draw.(Shape form); fill.(Shape form) form指Shape接口的对象。
package hello;
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
public class Painting extends JFrame {
public Painting() {
super();
initialize();// 调用初始化方法
}
// 初始化方法
private void initialize() {
this.setSize(300, 200); // 设置窗体大小
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭模式
add(new CanvasPanel()); // 设置窗体面板为绘图面板对象
this.setTitle("绘图实例2"); // 设置窗体标题
}
public static void main(String[] args) {
new Painting().setVisible(true);
}
class CanvasPanel extends JPanel {
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2 = (Graphics2D) g;//强制类型转换为Graphics2D类型
Shape[] shapes = new Shape[4]; // 声明图形数组
shapes[0] = new Ellipse2D.Double(5, 5, 100, 100); // 创建圆形对象
// 创建矩形对象
shapes[1] = new Rectangle2D.Double(110, 5, 100, 100);
shapes[2] = new Rectangle2D.Double(15, 15, 80, 80); // 创建矩形对象
shapes[3] = new Ellipse2D.Double(120, 15, 80, 80); // 创建圆形对象
for (Shape shape : shapes) { // 遍历图形数组
Rectangle2D bounds = shape.getBounds2D();
if (bounds.getWidth() == 80)
g2.fill(shape); // 填充图形
else
g2.draw(shape); // 绘制图形
}
}
}
}
二.绘图颜色与画笔属性
1.设置颜色
Color col = new Color(int r,int g,int b) 或 Color col = new Col(int rgb)
rgb:颜色值,该值是红、绿、蓝三原色的总和; r:该参数是三原色中红色的取值。
Color 类定义了常见色彩的常量值,即静态的Color对象:
Color BLACK 黑色 Color CYAN 青色 Color LIGHT_GRAY 深灰色
绘图类可以使用setColor()方法设置当前颜色. setColor(Color color);
public void paint(Graphics g)
{
super.paint(g);
Graphics2D g2 = (Graphics2D) g;//强制类型转换为Graphics2D类型
g.setColor(Color.RED);
g.drawLine(10, 10, 30, 30);
super.paint(g);
Graphics2D g2 = (Graphics2D) g;//强制类型转换为Graphics2D类型
g.setColor(Color.RED);
g.drawLine(10, 10, 30, 30);
}
设置绘图颜色之后,再进行绘制都会采用该颜色作为前景色,如果再想绘制其他颜色的,则需要再次调用setColor()方法。
2.画笔属性
默认情况下,Graphics绘图类使用的笔画属性是粗细为1个像素的正方形,而Graphics2D类可以调用setStroke()方法设置笔画属性。
setStroke(Stroke stroke)参数stroke是Stroke接口的实现类。
三.绘制文本
在java.awt包中定义的Font类封装了字体的名称、样式、大小等属性。
Font(String name,int style, int size); 字体样式可以使用Font类的PLAIN(普通)、BOLD(粗体)、ITALIC(粗体)。
设置绘图类的字体用setFont()方法。 setFont(Font font) 参数font 是Font 类的字体对象。
drawString()方法,可以实现在图片上显示文字的功能。 drawString(String str,int x,int y)或float。x、y代表字符串的水平、垂直起始位置。
绘制一个矩形图,在矩形图的中间显示文本,文本的内容是当前时间。
package hello;
import java.awt.*;
import java.awt.geom.*;
import java.util.*;
import javax.swing.*;
public class DrawString extends JFrame {
private Shape rect; // 矩形对象
private Font font; // 字体对象
private Date date; // 当前日期对象
public DrawString() {
rect = new Rectangle2D.Double(10, 10, 200, 80);
font = new Font("宋体", Font.BOLD, 16);
date = new Date();
this.setSize(230, 140); // 设置窗体大小
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭模式
add(new CanvasPanel()); // 设置窗体面板为绘图面板对象
this.setTitle("么么哒"); // 设置窗体标题
}
public static void main(String[] args) {
new DrawString().setVisible(true);
}
class CanvasPanel extends Canvas {
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.CYAN); // 设置当前绘图颜色
g2.fill(rect); // 填充矩形
g2.setColor(Color.BLUE); // 设置当前绘图颜色
g2.setFont(font); // 设置字体
g2.drawString("现在时间是", 20, 30); // 绘制文本
g2.drawString(String.format("%tr", date), 50, 60); // 绘制时间文本
}
}
}
四.绘制图片
drawImage(Image img,int x,int y,ImageObserver observer) img:要显示的图片对象,x、y即水平 垂直位置,observer:要通知的图像观察者。
package hello;
import java.awt.*;
import java.net.*;
import javax.swing.*;
public class DrawImage extends JFrame {
Image img;
public DrawImage() {
URL imgUrl = DrawImage.class.getResource("/img/lemon.jpg");// 获取图片资源的路径
img = Toolkit.getDefaultToolkit().getImage(imgUrl); // 获取图片资源
this.setSize(750, 800); // 设置窗体大小
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭模式
add(new CanvasPanel()); // 设置窗体面板为绘图面板对象
this.setTitle("绘制图片"); // 设置窗体标题
}
public static void main(String[] args) {
new DrawImage().setVisible(true);
}
class CanvasPanel extends Canvas {
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
g2.drawImage(img, 0, 0, this); // 显示图片
}
}
}
五.图像的处理
1.放大与缩小
package hello;
import java.awt.*;
import java.net.*;
import javax.swing.*;
public class DrawImage extends JFrame {
Image img;
private JPanel contentPanel = null;
private JSlider jSlider = null;
private int imgWidth, imgHeight;
private Canvas canvas = null;
public DrawImage() {
initialize(); // 调用初始化方法
}
// 界面初始化方法
private void initialize() {
URL imgUrl = DrawImage.class.getResource("/img/lemon.jpg");// 获取图片资源的路径
img = Toolkit.getDefaultToolkit().getImage(imgUrl);// 获取图片资源
canvas = new MyCanvas();
this.setBounds(100, 100, 800, 600); // 设置窗体大小和位置
this.setContentPane(getContentPanel()); // 设置内容面板
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭模式
this.setTitle("图片的放大与缩小"); // 设置窗体标题
}
// 内容面板的布局
private JPanel getContentPanel() {
if (contentPanel == null) {
contentPanel = new JPanel();
contentPanel.setLayout(new BorderLayout());
contentPanel.add(getJSlider(), BorderLayout.SOUTH);
contentPanel.add(canvas, BorderLayout.CENTER);
}
return contentPanel;
}
// 获取滑块组件
private JSlider getJSlider() {
if (jSlider == null) {
jSlider = new JSlider();
jSlider.setMaximum(1000);
jSlider.setValue(100);
jSlider.setMinimum(1);
jSlider.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent e) {
canvas.repaint();
}
});
}
return jSlider;
}
// 主方法
public static void main(String[] args) {
new DrawImage().setVisible(true);
}
// 画板类
class MyCanvas extends Canvas {
public void paint(Graphics g) {
int newW = 0, newH = 0;
imgWidth = img.getWidth(this); // 获取图片宽度
imgHeight = img.getHeight(this); // 获取图片高度
float value = jSlider.getValue();// 滑块组件的取值
newW = (int) (imgWidth * value / 100);// 计算图片放大后的宽度
newH = (int) (imgHeight * value / 100);// 计算图片放大后的高度
g.drawImage(img, 0, 0, newW, newH, this);// 绘制指定大小的图片
}
}
}
2.图像翻转
drawImage(Image img,int dx1,int dy1,int dx2,int dy2,int sx1,int sy1,int sx2,int sy2,ImageOnserver observer)
dx1 dy1: 目标矩形第一个坐标的x、y位置 dx2 dy2: 目标矩形第二个坐标的x、y位置
sx1 sy1:源矩形第一个坐标的x、y位置 sx2 sy2:源矩形第二个坐标的x、y位置
要将源矩形的第一个坐标映射到目标矩形的第一个坐标...
package hello;
import java.awt.*;
import java.net.URL;
import javax.swing.*;
public class DrawImage extends JFrame {
private Image img;
private int dx1, dy1, dx2, dy2;
private int sx1, sy1, sx2, sy2;
private JPanel jPanel = null;
private JPanel jPanel1 = null;
private JButton jButton = null;
private JButton jButton1 = null;
private MyCanvas canvasPanel = null;
public DrawImage() {
dx2 = sx2 = 200; // 初始化图像大小
dy2 = sy2 = 200;
initialize(); // 调用初始化方法
}
// 界面初始化方法
private void initialize() {
URL imgUrl = DrawImage.class.getResource("/img/a1.jpg");// 获取图片资源的路径
img = Toolkit.getDefaultToolkit().getImage(imgUrl); // 获取图片资源
this.setBounds(200, 200, 600, 500); // 设置窗体大小和位置
this.setContentPane(getJPanel());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭模式
this.setTitle("图片翻转"); // 设置窗体标题
}
// 获取内容面板的方法
private JPanel getJPanel() {
if (jPanel == null) {
jPanel = new JPanel();
jPanel.setLayout(new BorderLayout());
jPanel.add(getControlPanel(), BorderLayout.SOUTH);
jPanel.add(getMyCanvas1(), BorderLayout.CENTER);
}
return jPanel;
}
// 获取按钮控制面板的方法
private JPanel getControlPanel() {
if (jPanel1 == null) {
GridBagConstraints gridBagConstraints = new GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
jPanel1 = new JPanel();
jPanel1.setLayout(new GridBagLayout());
jPanel1.add(getJButton(), new GridBagConstraints());
jPanel1.add(getJButton1(), gridBagConstraints);
}
return jPanel1;
}
// 获取水平翻转按钮
private JButton getJButton() {
if (jButton == null) {
jButton = new JButton();
jButton.setText("水平翻转");
jButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
sx1 = Math.abs(sx1 - 200);
sx2 = Math.abs(sx2 - 200);
canvasPanel.repaint();
}
});
}
return jButton;
}
// 获取垂直翻转按钮
private JButton getJButton1() {
if (jButton1 == null) {
jButton1 = new JButton();
jButton1.setText("垂直翻转");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
sy1 = Math.abs(sy1 - 200);
sy2 = Math.abs(sy2 - 200);
canvasPanel.repaint();
}
});
}
return jButton1;
}
// 获取画板面板
private MyCanvas getMyCanvas1() {
if (canvasPanel == null) {
canvasPanel = new MyCanvas();
}
return canvasPanel;
}
// 主方法
public static void main(String[] args) {
new DrawImage().setVisible(true);
}
// 画板
class MyCanvas extends JPanel {
public void paint(Graphics g) {
g.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, this);// 绘制指定大小的图片
}
}
}
3.图像旋转
package hello;
import java.awt.*;
import java.net.URL;
import javax.swing.*;
public class DrawImage extends JFrame {
private Image img;
private MyCanvas canvasPanel = null;
public DrawImage() {
initialize(); // 调用初始化方法
}
// 界面初始化方法
private void initialize() {
// 获取图片资源的路径
URL imgUrl = DrawImage.class.getResource("/img/a1.jpg");
img = Toolkit.getDefaultToolkit().getImage(imgUrl); // 获取图片资源
canvasPanel = new MyCanvas();
this.setBounds(100, 100, 400, 350); // 设置窗体大小和位置
add(canvasPanel);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭模式
this.setTitle("图片旋转"); // 设置窗体标题
}
// 主方法
public static void main(String[] args) {
new DrawImage().setVisible(true);
}
// 画板
class MyCanvas extends JPanel {
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.rotate(Math.toRadians(5));// 旋转5°;toRadians()方法接受弧度值,否则只接受弧度值
g2.drawImage(img, 70, 10, 200, 200, this);// 绘制指定大小的图片
g2.rotate(Math.toRadians(5));
g2.drawImage(img, 70, 10, 200, 200, this);// 绘制指定大小的图片
g2.rotate(Math.toRadians(5));
g2.drawImage(img, 70, 10, 200, 200, this);// 绘制指定大小的图片
}
}
}
4.图像倾斜
shear(double shx,double shy) shx和shy代表的是水平方向和垂直方向的倾斜量。
package hello;
import java.awt.*;
import java.net.URL;
import javax.swing.*;
public class DrawImage extends JFrame {
private Image img;
private MyCanvas canvasPanel = null;
public DrawImage() {
initialize(); // 调用初始化方法
}
// 界面初始化方法
private void initialize() {
// 获取图片资源的路径
URL imgUrl = DrawImage.class.getResource("/img/lemon.jpg");
img = Toolkit.getDefaultToolkit().getImage(imgUrl); // 获取图片资源
canvasPanel = new MyCanvas();
this.setBounds(100, 100, 400, 300); // 设置窗体大小和位置
add(canvasPanel);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭模式
this.setTitle("图片倾斜"); // 设置窗体标题
}
// 主方法
public static void main(String[] args) {
new DrawImage().setVisible(true);
}
// 画板
class MyCanvas extends JPanel {
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.shear(0.3, 0);
g2.drawImage(img, 0, 0, 300, 200, this);// 绘制指定大小的图片
}
}
}
六.播放音频文件
简单的播放音频使用Applet类的newAudioClip()方法创建音频剪辑对象,然后调用play()方法进行播放
newAudioClip(URL url) 参数url指音频文件的URL路径。
package hello;
import java.applet.*;
import java.awt.*;
import java.io.File;
import java.net.MalformedURLException;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
public class MusicPlay extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel jContentPane = null;
private JTextField filePath = null;
private JButton openFile = null;
private JButton playButton = null;
private File selectedFile;
private AudioClip audioClip;
private JTextField getJTextField() {
if (filePath == null) {
filePath = new JTextField();
filePath.setPreferredSize(new Dimension(200, 22));
filePath.setEditable(false);
}
return filePath;
}
// 获取选择文件按钮的方法
private JButton getOpenFile() {
if (openFile == null) {
openFile = new JButton();
openFile.setText("选择文件");
openFile.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
JFileChooser fileChooser = new JFileChooser();
fileChooser
.setFileFilter(new FileNameExtensionFilter(
"支持的音频文件(*.mid、*.wav、*.au", "wav",
"au", "mid"));
fileChooser.showOpenDialog(MusicPlay.this);
selectedFile = fileChooser.getSelectedFile();
filePath.setText(selectedFile.getAbsolutePath());
}
});
}
return openFile;
}
// 获取播放按钮的方法
private JButton getPlayButton() {
if (playButton == null) {
playButton = new JButton();
playButton.setText("播放");
playButton
.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(
java.awt.event.ActionEvent e) {
if (selectedFile != null) {
try {
if (audioClip != null)
audioClip.stop();
audioClip = Applet
.newAudioClip(selectedFile
.toURI().toURL());
audioClip.play();
} catch (MalformedURLException e1) {
e1.printStackTrace();
}
}
}
});
}
return playButton;
}
public static void main(String[] args) {
MusicPlay thisClass = new MusicPlay();
thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
thisClass.setVisible(true);
}
public MusicPlay() {
super();
initialize();
}
// 初始化方法
private void initialize() {
this.setSize(408, 79);
this.setContentPane(getJContentPane());
this.setTitle("JFrame");
}
// 初始化内容面板的方法
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(new FlowLayout());
jContentPane.add(getJTextField(), null);
jContentPane.add(getOpenFile(), null);
jContentPane.add(getPlayButton(), null);
}
return jContentPane;
}
}
一.绘制图形
eg.创建DrawCircle类,使该类继承JFrame类称为窗口组件,在类中继承JPanel类的DrawPanel内部类,并重写paint() 方法,绘制5个圆形。
package hello;
import java.awt.*;
import javax.swing.*;
public class DrawCircle extends JFrame {
private final int OVAL_WIDTH = 80;// 圆形的宽
private final int OVAL_HEIGHT = 80;// 圆形的高
public DrawCircle() {
super();//调用父类的构造方法,先执行父类方法再执行子类方法
initialize();// 调用初始化方法
}
// 初始化方法
private void initialize() {
this.setSize(300, 200);// 设置窗体大小
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置窗体关闭模式
setContentPane(new DrawPanel());// 设置窗体面板为绘图面板对象
this.setTitle("绘图圆形");// 设置窗体标题
}
public static void main(String[] args) {
new DrawCircle().setVisible(true);
}
// 创建绘图面板
class DrawPanel extends JPanel {
public void paint(Graphics g) {
super.paint(g);
g.drawOval(10, 10, OVAL_WIDTH, OVAL_HEIGHT); // 绘制第1个圆形
g.drawOval(80, 10, OVAL_WIDTH, OVAL_HEIGHT); // 绘制第2个圆形
g.drawOval(150, 10, OVAL_WIDTH, OVAL_HEIGHT); // 绘制第3个圆形
g.drawOval(50, 70, OVAL_WIDTH, OVAL_HEIGHT); // 绘制第4个圆形
g.drawOval(120, 70, OVAL_WIDTH, OVAL_HEIGHT); // 绘制第5个圆形
}
}
}
1.画线段
drawLine(int x1,int y1,int x2,int y2) 在点(x1,y1)与点(x2,y2)之间画线段。
2.画圆弧
drawArc(int x,int y,int width,int height,int startAngle, int arcAngle)
椭圆的中心是它的外接矩形的中心,其中参数是外接矩形的左上角坐标(x,y),宽是width,高是heigh。参数startAngle的单位是 “度”,参数 startAngle 表示开始角度,arcAngle 表示相对于开始角度而言弧跨越的角度。参数 startAngle 表示开始角度,arcAngle 表示相对于开始角度而言弧跨越的角度。正值度数是逆时针方向,负值度数是顺时针方向,例如-90度是6点钟方位。
fillArc(int x,int y,int width, int height, int startAngle, int arcAngle):用setColor()方法设定的颜色,画着色椭圆的一部分。
g.drawArc(100,40,90,50,180,180); // 画圆弧线
g.setColor(Color.yellow); g.fillArc(10,100,40,40,0,-270); // 填充缺右上角的四分之三的椭圆
g.setColor(Color.yellow); g.fillArc(10,100,40,40,0,-270); // 填充缺右上角的四分之三的椭圆
3.画椭圆
drawOval(int x,int y,int width,int height)参数x和y指定椭圆形左上角的位置,参数width和height是横轴和纵轴。
fillOval(int x,int y,int width,int height):是用预定的颜色填充的椭圆形,是一个着色块。
fillOval(int x,int y,int width,int height):是用预定的颜色填充的椭圆形,是一个着色块。
g.drawOval(10,10,60,120);//画椭圆
g.setColor(Color.magenta); g.fillOval(15,140,100,50); // 填充椭圆
4.画矩形
(1)普通矩形
drawRect(int x,int y,int width,int height)参数x和y指定左上角的位置,参数width和height是矩形的宽和高。
g.drawRect(80,100,40,25);//画线框
g.setColor(Color.yellow); g.fillRect(20,70,20,30);//画着色块
(2)圆角矩形
drawRoundRect(int x,int y,int width, int height, int arcWidth, int arcHeight)参数x和y指定矩形左上角的位置;参数width和heigth是矩形的宽和高;arcWidth和arcHeight分别是圆角弧的横向直径和纵向直径。
g.drawRoundRect(10,10,150,70,40,25);//画一个圆角矩形
g.setColor(Color.blue); g.fillRoundRect(80,100,100,100,60,40);//涂一个圆角矩形块
g.setColor(Color.blue); g.fillRoundRect(80,100,100,100,60,40);//涂一个圆角矩形块
(3)三维矩形
draw3DRect(int x,int y,int width,int height, boolean raised) 参数x和y指定矩形左上角的位置,参数width和height是矩形的宽和高,参数raised是突出与否。
fill3DRect(int x,int y,int width,int height,boolean raised):用预定的颜色填充一个突出显示的矩形。
g.draw3DRect(80,100,40,25,true);//画一个线框
g.setColor(Color.yellow); g.fill3DRect(20,70,20,30,true);//画一个着色块
5.画多边形
(1)drawPolygon(int xpoints[],int yPoints[],int nPoints) 数组xPoints[]存储x坐标点,yPoints[]存储y坐标点,nPoints是坐标点个数。
注意,上述方法并不自动闭合多边形,要画一个闭合的多边形,给出的坐标点的最后一点必须与第一点相同.以下代码实现填充一个三角形和画一个八边形。
int px1[]={50,90,10,50};//首末点相重,才能画多边形
int py1[]={10,50,50,10};
int px2[]={140,180,170,180,140,100,110,140};
int py2[]={5,25,35,45,65,35,25,5};
g.setColor(Color.blue); g.fillPolygon(px1,py1,4);
g.setColor(Color.red); g.drawPolygon(px2,py2,9);
注意,上述方法并不自动闭合多边形,要画一个闭合的多边形,给出的坐标点的最后一点必须与第一点相同.以下代码实现填充一个三角形和画一个八边形。
int px1[]={50,90,10,50};//首末点相重,才能画多边形
int py1[]={10,50,50,10};
int px2[]={140,180,170,180,140,100,110,140};
int py2[]={5,25,35,45,65,35,25,5};
g.setColor(Color.blue); g.fillPolygon(px1,py1,4);
g.setColor(Color.red); g.drawPolygon(px2,py2,9);
(2)用多边形对象画多边形。用多边形类Polygon创建一个多边形对象,然后用这个对象绘制多边形。
Polygon():创建多边形对象,暂时没有坐标点。
Polygon(int xPoints[],int yPoints[],int nPoints):用指定的坐标点创建多边形对象。
addPoint():将一个坐标点加入到Polygon对象中。
drawPolygon(Polygon p):绘制多边形。
fillPolygon(Polygon p):和指定的颜色填充多边形。
Polygon(int xPoints[],int yPoints[],int nPoints):用指定的坐标点创建多边形对象。
addPoint():将一个坐标点加入到Polygon对象中。
drawPolygon(Polygon p):绘制多边形。
fillPolygon(Polygon p):和指定的颜色填充多边形。
eg.画一个三角形和填充一个黄色的三角形。注意,用多边形对象画封闭多边形不要求首末点重合。
int x[]={140,180,170,180,140,100,110,100};
int y[]={5,25,35,45,65,45,35,25};
Polygon ponlygon1=new Polygon();
polygon1.addPoint(50,10);
polygon1.addPoint(90,50);
polygon1.addPoint(10,50);
g.drawPolygon(polygon1);
g.setColor(Color.yellow);
Polygon polygon2 = new Polygon(x,y,8);
g.fillPolygon(polygon2);
int x[]={140,180,170,180,140,100,110,100};
int y[]={5,25,35,45,65,45,35,25};
Polygon ponlygon1=new Polygon();
polygon1.addPoint(50,10);
polygon1.addPoint(90,50);
polygon1.addPoint(10,50);
g.drawPolygon(polygon1);
g.setColor(Color.yellow);
Polygon polygon2 = new Polygon(x,y,8);
g.fillPolygon(polygon2);
6.擦除矩形块
当需要在一个着色图形的中间有一个空缺的矩形的情况,可用背景色填充一矩形块实现,相当于在该矩形块上使用了 “橡皮擦”。 clearRect(int x,int y, int width,int height):擦除一个由参数指定的矩形块的着色。
g.setColor(Color.blue); g.fillOval(50,50,100,100); g.clearRect(70,70,40,55);
g.setColor(Color.blue); g.fillOval(50,50,100,100); g.clearRect(70,70,40,55);
7.限定作图显示区域
用一个矩形表示图形的显示区域,要求图形在指定的范围内有效,不重新计算新的坐标值,自动实现超出部分不显示 clipRect(int x,int y,int width,int height)
g.clipRect(0,0,100,50); g.clipRect(50,25,100,50); 相当于g.clipRect(50,25,50,25);
g.clipRect(0,0,100,50); g.clipRect(50,25,100,50); 相当于g.clipRect(50,25,50,25);
8.复制图形
利用Graphics类的方法copyArea()可以实现图形的复制,其使用格式是:
copyArea(int x,int y,int width,int height, int dx, int dy),dx和dy分别表示将图形粘贴到原位置偏移的像素点数,正值为往右或往下偏移是,负值为往左或往上偏移量。位移的参考点是要复制矩形的左上角坐标。
例如,以下代码示意图形的复制,将一个矩形的一部分、另一个矩形的全部分别自制。
g.drawRect(10,10,60,90);
g.fillRect(90,10,60,90);
g.copyArea(40,50,60,70,-20,80);
g.copyArea(110,50,60,60,10,80);
copyArea(int x,int y,int width,int height, int dx, int dy),dx和dy分别表示将图形粘贴到原位置偏移的像素点数,正值为往右或往下偏移是,负值为往左或往上偏移量。位移的参考点是要复制矩形的左上角坐标。
例如,以下代码示意图形的复制,将一个矩形的一部分、另一个矩形的全部分别自制。
g.drawRect(10,10,60,90);
g.fillRect(90,10,60,90);
g.copyArea(40,50,60,70,-20,80);
g.copyArea(110,50,60,60,10,80);
要想绘制指定形状的图形,需要先创建并初始化该图形类的对象,这些图形类必须是Shape接口的实现类。语法为 draw.(Shape form); fill.(Shape form) form指Shape接口的对象。
package hello;
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
public class Painting extends JFrame {
public Painting() {
super();
initialize();// 调用初始化方法
}
// 初始化方法
private void initialize() {
this.setSize(300, 200); // 设置窗体大小
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭模式
add(new CanvasPanel()); // 设置窗体面板为绘图面板对象
this.setTitle("绘图实例2"); // 设置窗体标题
}
public static void main(String[] args) {
new Painting().setVisible(true);
}
class CanvasPanel extends JPanel {
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2 = (Graphics2D) g;//强制类型转换为Graphics2D类型
Shape[] shapes = new Shape[4]; // 声明图形数组
shapes[0] = new Ellipse2D.Double(5, 5, 100, 100); // 创建圆形对象
// 创建矩形对象
shapes[1] = new Rectangle2D.Double(110, 5, 100, 100);
shapes[2] = new Rectangle2D.Double(15, 15, 80, 80); // 创建矩形对象
shapes[3] = new Ellipse2D.Double(120, 15, 80, 80); // 创建圆形对象
for (Shape shape : shapes) { // 遍历图形数组
Rectangle2D bounds = shape.getBounds2D();
if (bounds.getWidth() == 80)
g2.fill(shape); // 填充图形
else
g2.draw(shape); // 绘制图形
}
}
}
}
二.绘图颜色与画笔属性
1.设置颜色
Color col = new Color(int r,int g,int b) 或 Color col = new Col(int rgb)
rgb:颜色值,该值是红、绿、蓝三原色的总和; r:该参数是三原色中红色的取值。
Color 类定义了常见色彩的常量值,即静态的Color对象:
Color BLACK 黑色 Color CYAN 青色 Color LIGHT_GRAY 深灰色
绘图类可以使用setColor()方法设置当前颜色. setColor(Color color);
public void paint(Graphics g)
{
super.paint(g);
Graphics2D g2 = (Graphics2D) g;//强制类型转换为Graphics2D类型
g.setColor(Color.RED);
g.drawLine(10, 10, 30, 30);
super.paint(g);
Graphics2D g2 = (Graphics2D) g;//强制类型转换为Graphics2D类型
g.setColor(Color.RED);
g.drawLine(10, 10, 30, 30);
}
设置绘图颜色之后,再进行绘制都会采用该颜色作为前景色,如果再想绘制其他颜色的,则需要再次调用setColor()方法。
2.画笔属性
默认情况下,Graphics绘图类使用的笔画属性是粗细为1个像素的正方形,而Graphics2D类可以调用setStroke()方法设置笔画属性。
setStroke(Stroke stroke)参数stroke是Stroke接口的实现类。
三.绘制文本
在java.awt包中定义的Font类封装了字体的名称、样式、大小等属性。
Font(String name,int style, int size); 字体样式可以使用Font类的PLAIN(普通)、BOLD(粗体)、ITALIC(粗体)。
设置绘图类的字体用setFont()方法。 setFont(Font font) 参数font 是Font 类的字体对象。
drawString()方法,可以实现在图片上显示文字的功能。 drawString(String str,int x,int y)或float。x、y代表字符串的水平、垂直起始位置。
绘制一个矩形图,在矩形图的中间显示文本,文本的内容是当前时间。
package hello;
import java.awt.*;
import java.awt.geom.*;
import java.util.*;
import javax.swing.*;
public class DrawString extends JFrame {
private Shape rect; // 矩形对象
private Font font; // 字体对象
private Date date; // 当前日期对象
public DrawString() {
rect = new Rectangle2D.Double(10, 10, 200, 80);
font = new Font("宋体", Font.BOLD, 16);
date = new Date();
this.setSize(230, 140); // 设置窗体大小
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭模式
add(new CanvasPanel()); // 设置窗体面板为绘图面板对象
this.setTitle("么么哒"); // 设置窗体标题
}
public static void main(String[] args) {
new DrawString().setVisible(true);
}
class CanvasPanel extends Canvas {
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.CYAN); // 设置当前绘图颜色
g2.fill(rect); // 填充矩形
g2.setColor(Color.BLUE); // 设置当前绘图颜色
g2.setFont(font); // 设置字体
g2.drawString("现在时间是", 20, 30); // 绘制文本
g2.drawString(String.format("%tr", date), 50, 60); // 绘制时间文本
}
}
}
四.绘制图片
drawImage(Image img,int x,int y,ImageObserver observer) img:要显示的图片对象,x、y即水平 垂直位置,observer:要通知的图像观察者。
package hello;
import java.awt.*;
import java.net.*;
import javax.swing.*;
public class DrawImage extends JFrame {
Image img;
public DrawImage() {
URL imgUrl = DrawImage.class.getResource("/img/lemon.jpg");// 获取图片资源的路径
img = Toolkit.getDefaultToolkit().getImage(imgUrl); // 获取图片资源
this.setSize(750, 800); // 设置窗体大小
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭模式
add(new CanvasPanel()); // 设置窗体面板为绘图面板对象
this.setTitle("绘制图片"); // 设置窗体标题
}
public static void main(String[] args) {
new DrawImage().setVisible(true);
}
class CanvasPanel extends Canvas {
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
g2.drawImage(img, 0, 0, this); // 显示图片
}
}
}
五.图像的处理
1.放大与缩小
package hello;
import java.awt.*;
import java.net.*;
import javax.swing.*;
public class DrawImage extends JFrame {
Image img;
private JPanel contentPanel = null;
private JSlider jSlider = null;
private int imgWidth, imgHeight;
private Canvas canvas = null;
public DrawImage() {
initialize(); // 调用初始化方法
}
// 界面初始化方法
private void initialize() {
URL imgUrl = DrawImage.class.getResource("/img/lemon.jpg");// 获取图片资源的路径
img = Toolkit.getDefaultToolkit().getImage(imgUrl);// 获取图片资源
canvas = new MyCanvas();
this.setBounds(100, 100, 800, 600); // 设置窗体大小和位置
this.setContentPane(getContentPanel()); // 设置内容面板
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭模式
this.setTitle("图片的放大与缩小"); // 设置窗体标题
}
// 内容面板的布局
private JPanel getContentPanel() {
if (contentPanel == null) {
contentPanel = new JPanel();
contentPanel.setLayout(new BorderLayout());
contentPanel.add(getJSlider(), BorderLayout.SOUTH);
contentPanel.add(canvas, BorderLayout.CENTER);
}
return contentPanel;
}
// 获取滑块组件
private JSlider getJSlider() {
if (jSlider == null) {
jSlider = new JSlider();
jSlider.setMaximum(1000);
jSlider.setValue(100);
jSlider.setMinimum(1);
jSlider.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent e) {
canvas.repaint();
}
});
}
return jSlider;
}
// 主方法
public static void main(String[] args) {
new DrawImage().setVisible(true);
}
// 画板类
class MyCanvas extends Canvas {
public void paint(Graphics g) {
int newW = 0, newH = 0;
imgWidth = img.getWidth(this); // 获取图片宽度
imgHeight = img.getHeight(this); // 获取图片高度
float value = jSlider.getValue();// 滑块组件的取值
newW = (int) (imgWidth * value / 100);// 计算图片放大后的宽度
newH = (int) (imgHeight * value / 100);// 计算图片放大后的高度
g.drawImage(img, 0, 0, newW, newH, this);// 绘制指定大小的图片
}
}
}
2.图像翻转
drawImage(Image img,int dx1,int dy1,int dx2,int dy2,int sx1,int sy1,int sx2,int sy2,ImageOnserver observer)
dx1 dy1: 目标矩形第一个坐标的x、y位置 dx2 dy2: 目标矩形第二个坐标的x、y位置
sx1 sy1:源矩形第一个坐标的x、y位置 sx2 sy2:源矩形第二个坐标的x、y位置
要将源矩形的第一个坐标映射到目标矩形的第一个坐标...
package hello;
import java.awt.*;
import java.net.URL;
import javax.swing.*;
public class DrawImage extends JFrame {
private Image img;
private int dx1, dy1, dx2, dy2;
private int sx1, sy1, sx2, sy2;
private JPanel jPanel = null;
private JPanel jPanel1 = null;
private JButton jButton = null;
private JButton jButton1 = null;
private MyCanvas canvasPanel = null;
public DrawImage() {
dx2 = sx2 = 200; // 初始化图像大小
dy2 = sy2 = 200;
initialize(); // 调用初始化方法
}
// 界面初始化方法
private void initialize() {
URL imgUrl = DrawImage.class.getResource("/img/a1.jpg");// 获取图片资源的路径
img = Toolkit.getDefaultToolkit().getImage(imgUrl); // 获取图片资源
this.setBounds(200, 200, 600, 500); // 设置窗体大小和位置
this.setContentPane(getJPanel());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭模式
this.setTitle("图片翻转"); // 设置窗体标题
}
// 获取内容面板的方法
private JPanel getJPanel() {
if (jPanel == null) {
jPanel = new JPanel();
jPanel.setLayout(new BorderLayout());
jPanel.add(getControlPanel(), BorderLayout.SOUTH);
jPanel.add(getMyCanvas1(), BorderLayout.CENTER);
}
return jPanel;
}
// 获取按钮控制面板的方法
private JPanel getControlPanel() {
if (jPanel1 == null) {
GridBagConstraints gridBagConstraints = new GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
jPanel1 = new JPanel();
jPanel1.setLayout(new GridBagLayout());
jPanel1.add(getJButton(), new GridBagConstraints());
jPanel1.add(getJButton1(), gridBagConstraints);
}
return jPanel1;
}
// 获取水平翻转按钮
private JButton getJButton() {
if (jButton == null) {
jButton = new JButton();
jButton.setText("水平翻转");
jButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
sx1 = Math.abs(sx1 - 200);
sx2 = Math.abs(sx2 - 200);
canvasPanel.repaint();
}
});
}
return jButton;
}
// 获取垂直翻转按钮
private JButton getJButton1() {
if (jButton1 == null) {
jButton1 = new JButton();
jButton1.setText("垂直翻转");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
sy1 = Math.abs(sy1 - 200);
sy2 = Math.abs(sy2 - 200);
canvasPanel.repaint();
}
});
}
return jButton1;
}
// 获取画板面板
private MyCanvas getMyCanvas1() {
if (canvasPanel == null) {
canvasPanel = new MyCanvas();
}
return canvasPanel;
}
// 主方法
public static void main(String[] args) {
new DrawImage().setVisible(true);
}
// 画板
class MyCanvas extends JPanel {
public void paint(Graphics g) {
g.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, this);// 绘制指定大小的图片
}
}
}
3.图像旋转
package hello;
import java.awt.*;
import java.net.URL;
import javax.swing.*;
public class DrawImage extends JFrame {
private Image img;
private MyCanvas canvasPanel = null;
public DrawImage() {
initialize(); // 调用初始化方法
}
// 界面初始化方法
private void initialize() {
// 获取图片资源的路径
URL imgUrl = DrawImage.class.getResource("/img/a1.jpg");
img = Toolkit.getDefaultToolkit().getImage(imgUrl); // 获取图片资源
canvasPanel = new MyCanvas();
this.setBounds(100, 100, 400, 350); // 设置窗体大小和位置
add(canvasPanel);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭模式
this.setTitle("图片旋转"); // 设置窗体标题
}
// 主方法
public static void main(String[] args) {
new DrawImage().setVisible(true);
}
// 画板
class MyCanvas extends JPanel {
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.rotate(Math.toRadians(5));// 旋转5°;toRadians()方法接受弧度值,否则只接受弧度值
g2.drawImage(img, 70, 10, 200, 200, this);// 绘制指定大小的图片
g2.rotate(Math.toRadians(5));
g2.drawImage(img, 70, 10, 200, 200, this);// 绘制指定大小的图片
g2.rotate(Math.toRadians(5));
g2.drawImage(img, 70, 10, 200, 200, this);// 绘制指定大小的图片
}
}
}
4.图像倾斜
shear(double shx,double shy) shx和shy代表的是水平方向和垂直方向的倾斜量。
package hello;
import java.awt.*;
import java.net.URL;
import javax.swing.*;
public class DrawImage extends JFrame {
private Image img;
private MyCanvas canvasPanel = null;
public DrawImage() {
initialize(); // 调用初始化方法
}
// 界面初始化方法
private void initialize() {
// 获取图片资源的路径
URL imgUrl = DrawImage.class.getResource("/img/lemon.jpg");
img = Toolkit.getDefaultToolkit().getImage(imgUrl); // 获取图片资源
canvasPanel = new MyCanvas();
this.setBounds(100, 100, 400, 300); // 设置窗体大小和位置
add(canvasPanel);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭模式
this.setTitle("图片倾斜"); // 设置窗体标题
}
// 主方法
public static void main(String[] args) {
new DrawImage().setVisible(true);
}
// 画板
class MyCanvas extends JPanel {
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.shear(0.3, 0);
g2.drawImage(img, 0, 0, 300, 200, this);// 绘制指定大小的图片
}
}
}
六.播放音频文件
简单的播放音频使用Applet类的newAudioClip()方法创建音频剪辑对象,然后调用play()方法进行播放
newAudioClip(URL url) 参数url指音频文件的URL路径。
package hello;
import java.applet.*;
import java.awt.*;
import java.io.File;
import java.net.MalformedURLException;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
public class MusicPlay extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel jContentPane = null;
private JTextField filePath = null;
private JButton openFile = null;
private JButton playButton = null;
private File selectedFile;
private AudioClip audioClip;
private JTextField getJTextField() {
if (filePath == null) {
filePath = new JTextField();
filePath.setPreferredSize(new Dimension(200, 22));
filePath.setEditable(false);
}
return filePath;
}
// 获取选择文件按钮的方法
private JButton getOpenFile() {
if (openFile == null) {
openFile = new JButton();
openFile.setText("选择文件");
openFile.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
JFileChooser fileChooser = new JFileChooser();
fileChooser
.setFileFilter(new FileNameExtensionFilter(
"支持的音频文件(*.mid、*.wav、*.au", "wav",
"au", "mid"));
fileChooser.showOpenDialog(MusicPlay.this);
selectedFile = fileChooser.getSelectedFile();
filePath.setText(selectedFile.getAbsolutePath());
}
});
}
return openFile;
}
// 获取播放按钮的方法
private JButton getPlayButton() {
if (playButton == null) {
playButton = new JButton();
playButton.setText("播放");
playButton
.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(
java.awt.event.ActionEvent e) {
if (selectedFile != null) {
try {
if (audioClip != null)
audioClip.stop();
audioClip = Applet
.newAudioClip(selectedFile
.toURI().toURL());
audioClip.play();
} catch (MalformedURLException e1) {
e1.printStackTrace();
}
}
}
});
}
return playButton;
}
public static void main(String[] args) {
MusicPlay thisClass = new MusicPlay();
thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
thisClass.setVisible(true);
}
public MusicPlay() {
super();
initialize();
}
// 初始化方法
private void initialize() {
this.setSize(408, 79);
this.setContentPane(getJContentPane());
this.setTitle("JFrame");
}
// 初始化内容面板的方法
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(new FlowLayout());
jContentPane.add(getJTextField(), null);
jContentPane.add(getOpenFile(), null);
jContentPane.add(getPlayButton(), null);
}
return jContentPane;
}
}