AWT绘图与音频播放



一.绘制图形

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); // 填充缺右上角的四分之三的椭圆

3.画椭圆

drawOval(int x,int y,int width,int height)参数x和y指定椭圆形左上角的位置,参数width和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);//涂一个圆角矩形块

(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);

(2)用多边形对象画多边形。用多边形类Polygon创建一个多边形对象,然后用这个对象绘制多边形。
Polygon():创建多边形对象,暂时没有坐标点。
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);

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);

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);

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);

要想绘制指定形状的图形,需要先创建并初始化该图形类的对象,这些图形类必须是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);
}
设置绘图颜色之后,再进行绘制都会采用该颜色作为前景色,如果再想绘制其他颜色的,则需要再次调用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); // 填充缺右上角的四分之三的椭圆

3.画椭圆

drawOval(int x,int y,int width,int height)参数x和y指定椭圆形左上角的位置,参数width和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);//涂一个圆角矩形块

(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);

(2)用多边形对象画多边形。用多边形类Polygon创建一个多边形对象,然后用这个对象绘制多边形。
Polygon():创建多边形对象,暂时没有坐标点。
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);

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);

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);

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);

要想绘制指定形状的图形,需要先创建并初始化该图形类的对象,这些图形类必须是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);
}
设置绘图颜色之后,再进行绘制都会采用该颜色作为前景色,如果再想绘制其他颜色的,则需要再次调用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;
	}
}




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值