JavaSE20—绘图
1. 绘制图形
Graphics类是所有图形上下文的抽象基类,它允许应用程序在组建以及闭屏图像上进行绘制。
Graphics类提供了绘图常用的方法,利用这些方法可以实现之线,矩形,多边形,椭圆,圆弧等形状的文本,图片的绘制操作。
Graphics2D类可以完成简单的图形绘制任务,该类继承自Graphics。
Graphics2D类是推荐使用的绘图类,具有更强大的功能,要绘制指定形状的图形,需要先创建并初始化该图形类的对象,这些图形类必须是Shape接口的实现类,然后使用Graphics2D类的draw()方法绘制图形对象或使用fill()方法填充对象
实例:在窗体中创建用于绘制图形的成员内部类,该内部类继承自JPanel类成为面板类,并使用Graphics2D类绘制图形。
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class DrawGraphics2DDemo extends JFrame {
public DrawGraphics2DDemo(){
super();
ini();
}
private void ini() {
// TODO Auto-generated method stub
this.setSize(300,200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.add(new CanvasPanel());
this.setTitle("绘图实例");
}
public static void main(String[] args){
new DrawGraphics2DDemo().setVisible(true);
}
//
class CanvasPanel extends JPanel{
public void paint(Graphics g){
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
Shape[] shapes = new Shape[4];
shapes[0] = new Rectangle2D.Float(25,25,70,70);
shapes[1] = new Rectangle2D.Float(130,10,100,100);
shapes[2] = new Ellipse2D.Float(130,10,100,100);
shapes[3] = new Ellipse2D.Float(10,10,100,100);
for(int i=0;i<shapes.length;i++){
if(i%2==0)
g2.fill(shapes[i]);
else
g2.draw(shapes[i]);
}
}
}
}
2. 绘图颜色与画笔
1) 绘图颜色的设置
使用Color类可以创建任何颜色的对象,而不用担心不同平台对改颜色是否支持。
创建Color对象的构造方法:
Color(int r,int g,int b);
绘图类可以使用setColor()方法设置当前颜色,使用绘图类的setColor()方法设置当前颜色:
public void paint(Graphics g){
super.paint(g);
Graphics2D g2 = (Graphics2D)g;
g2.setColor(Color.BLUE);
Rectangle2D rect = new Rectangle2D.Double(25,25,70,70);
g2.draw(rect);
}
2) 设置画笔属性
默认情况下,使用的画笔属性是粗细为1个像素的正方形,而Java2D的Graphics2D类可以调用setStock()方法设置壁画的属性。
3. 绘制文本
1) 设置字体,字号和字形
在Java.awt中提供了Font类,该类封装了字体名称,字号和样式等属性。
Font(String name,int style,int size)
设置绘图类的字体可以使用绘图类的setFont()方法。
2) 显示文本内容
Graphics2D类提供了drawString()方法,使用该方法可以在图像上下文中绘制文本内容。
实例:在项目中创建DrawString类,绘制唐诗
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
public class DrawStringDemo extends JFrame {
public DrawStringDemo(){
this.setSize(260,180);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(new CanvasPanel());
this.setTitle("DrawStringDemo");
}
public static void main(String[] args){
new DrawStringDemo().setVisible(true);
}
class CanvasPanel extends Canvas{
public void paint(Graphics g){
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.BLUE);
Font font = new Font("宋体",Font.BOLD,24);
g2.setFont(font);
g2.drawString("静夜思", 80, 40);
font = new Font("宋体",Font.BOLD|Font.ITALIC,18);
g2.setFont(font);
g2.drawString("李白", 130, 70);
font = new Font("宋体",Font.PLAIN,14);
g2.setFont(font);
g2.drawString("床前明月光", 40, 100);
g2.drawString("疑是地上霜", 120, 100);
g2.drawString("举头望明月",40,120);
g2.drawString("低头思故乡", 120, 120);
}
}
}
4. 绘制图像
使用Graphics2D类的drawImage()方法可以在绘图上下文中绘制图像
该方法的使用与绘制文本drawString()方法类似,唯一不同的是drawImage()方法需要指定通知的图像观察者。
实例:绘制图像
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.net.URL;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class DrawImageDemo extends JFrame {
private Image img = null;
private JPanel contentPanel = null;
private Canvas canvas = null;
public DrawImageDemo(){
initialize();
}
private void initialize() {
// TODO Auto-generated method stub
URL imgUrl = DrawImageDemo.class.getResource("/img/愤怒的小鸟.jpg");
img = Toolkit.getDefaultToolkit().getImage(imgUrl);
canvas = new CanvasPanel();
this.setBounds(200,160,440,639);
this.setContentPane(getContentPanel());
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("DrawImageDemo");
this.setVisible(true);
}
private JPanel getContentPanel(){
if(contentPanel == null){
contentPanel = new JPanel();
contentPanel.setLayout(new BorderLayout());
contentPanel.add(canvas,BorderLayout.CENTER);
canvas.repaint();
}
return contentPanel;
}
public static void main(String[] args){
new DrawImageDemo();
}
class CanvasPanel extends Canvas {
public void paint(Graphics g){
g.drawImage(img, 0,0,this);
}
}
}
简单画图程序:
DrawPicCanvas.java:
import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.Image;
@SuppressWarnings("serial")
public class DrawPicCanvas extends Canvas{
//定义Image对象的引用
private Image img = null;
public DrawPicCanvas(){
super();
}
public void setImg(Image img) {
this.img = img;
}
//重写paint方法
public void paint(Graphics g){
g.drawImage(img,0,0,null);//画布上绘图
}
//解决屏幕闪烁
public void update(Graphics g){
paint(g);
}
}
DrawPicFrame.java:
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.BufferedImage;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JToolBar;
import javax.swing.UIManager;
import javax.swing.WindowConstants;
public class DrawPicFrame extends JFrame {
// 创建图像对象
BufferedImage image = new BufferedImage(570, 390,
BufferedImage.TYPE_INT_BGR);
Graphics gs = image.getGraphics(); // 获得图像的绘图上下文对象
Graphics2D g = (Graphics2D) gs; // 将绘图上下文对象转换为Graphics2D类型
DrawPicCanvas canvas = new DrawPicCanvas(); // 创建画布对象
Color foreColor = Color.BLUE; // 定义前景色
Color backgroundColor = Color.WHITE; // 定义背景色
boolean rubber = false; // 橡皮标识变量
int x = -1; // 上一次鼠标绘制点的横坐标
int y = -1; // 上一次鼠标绘制点的纵坐标
public DrawPicFrame() {
super();
setTitle("简易画图程序");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setBounds(100, 80, 574, 397);
g.setColor(backgroundColor); // 用背景色设置绘图上下文对象的颜色
g.fillRect(0, 0, 570, 390); // 用背景色填充整个画布
g.setColor(foreColor); // 用前景色设置绘图上下文对象的颜色
canvas.setImg(image); // 设置画布的图像
getContentPane().add(canvas); // 将画布添加到窗体容器默认布局的中部位置
canvas.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(final MouseEvent e) {
if (rubber) { // 橡皮标识为true,表示使用橡皮
if (x > 0 && y > 0) {
g.setColor(backgroundColor); // 用背景色设置绘图上下文对象的颜色
g.fillRect(x, y, 10, 10); // 擦除鼠标经过位置的图像
}
x = e.getX(); // 获得鼠标在画布上的横坐标
y = e.getY(); // 获得鼠标在画布上的纵坐标
} else { // 橡皮标识为false,表示画图
if (x > 0 && y > 0) {
// 在鼠标经过处画直线
g.drawLine(x, y, e.getX(), e.getY());
}
x = e.getX(); // 上一次鼠标绘制点的横坐标
y = e.getY(); // 上一次鼠标绘制点的纵坐标
}
canvas.repaint(); // 更新画布
}
public void mouseMoved(final MouseEvent arg0) {
if (rubber) {
// 设置鼠标指针的形状
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
} else {
// 设置鼠标指针的形状
setCursor(Cursor
.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
}
}
});
canvas.addMouseListener(new MouseAdapter() {
public void mouseReleased(final MouseEvent arg0) {
x = -1; // 上一次鼠标绘制点的横坐标
y = -1; // 上一次鼠标绘制点的纵坐标
}
});
final JToolBar toolBar = new JToolBar();
toolBar.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseMoved(final MouseEvent arg0) {
// 设置鼠标指针的形状
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
});
getContentPane().add(toolBar, BorderLayout.NORTH);
final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent arg0) {
// 声明画笔的属性,粗细为1像素
BasicStroke bs = new BasicStroke(1, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_MITER);
g.setStroke(bs); // 设置绘图上下文对象的画笔
}
});
button.setText(" 细 线 ");
toolBar.add(button);
final JButton button_1 = new JButton();
button_1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent arg0) {
// 声明画笔的属性,粗细为2像素
BasicStroke bs = new BasicStroke(2, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_MITER);
g.setStroke(bs); // 设置绘图上下文对象的画笔
}
});
button_1.setText(" 粗 线 ");
toolBar.add(button_1);
final JButton button_2 = new JButton();
button_2.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent arg0) {
// 声明画笔的属性,粗细为4像素
BasicStroke bs = new BasicStroke(4, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_MITER);
g.setStroke(bs); // 设置绘图上下文对象的画笔
}
});
button_2.setText(" 较 粗 ");
toolBar.add(button_2);
final JButton button_3 = new JButton();
button_3.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent arg0) {
// 打开选择颜色对话框
Color bgColor = JColorChooser.showDialog(null, "选择颜色对话框",
Color.CYAN);
if (bgColor != null) {
backgroundColor = bgColor;
}
g.setColor(backgroundColor); // 设置绘图上下文对象的背景色
g.fillRect(0, 0, 570, 390); // 用背景色填充整个画布
g.setColor(foreColor); // 设置绘图上下文对象的前景色
canvas.repaint(); // 更新画布
}
});
button_3.setText("背景颜色");
toolBar.add(button_3);
final JButton button_4 = new JButton();
button_4.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent arg0) {
// 打开选择颜色对话框
Color fColor = JColorChooser.showDialog(null, "选择颜色对话框",
Color.CYAN);
if (fColor != null) {
foreColor = fColor;
}
g.setColor(foreColor); // 设置绘图上下文对象的前景色
}
});
button_4.setText("前景颜色");
toolBar.add(button_4);
final JButton button_5 = new JButton();
button_5.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent arg0) {
g.setColor(backgroundColor); // 设置绘图上下文对象的背景色
g.fillRect(0, 0, 570, 390); // 用背景色填充整个画布
g.setColor(foreColor); // 设置绘图上下文对象的前景色
canvas.repaint(); // 更新画布
}
});
button_5.setText(" 清 除 ");
toolBar.add(button_5);
final JButton button_6 = new JButton();
button_6.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent arg0) {
if (button_6.getText().equals(" 橡 皮 ")) { // 单击工具栏上的橡皮按钮,使用橡皮
rubber = true; // 设置橡皮标识为true
button_6.setText(" 画 图 "); // 改变按钮上显示的文本为画图
} else { // 单击工具栏上的画图按钮,使用画笔
rubber = false; // 设置橡皮标识为false
button_6.setText(" 橡 皮 "); // 改变按钮上显示的文本为橡皮
}
}
});
button_6.setText(" 橡 皮 ");
toolBar.add(button_6);
final JButton button_7 = new JButton();
button_7.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent arg0) {
System.exit(0); // 退出应用程序
}
});
button_7.setText(" 退 出 ");
toolBar.add(button_7);
}
public static void main(String[] args) {
try {
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
} catch (Throwable e) {
}
DrawPicFrame frame = new DrawPicFrame();
frame.setVisible(true);
}
}