Bootstrap

【老白学 Java】第一次绘制

第一次绘制

码老白
文章来源:《Head First Java》修炼感悟。

在上文中,老白惊叹于事件的神奇魔力,跃跃欲试准备做些图形界面的应用程序。 不过在此之前,老白有必要研究一下 Java 的绘图机制,毕竟一个漂亮的界面才是良好的开端。

一起来涂鸦

你是否相信,Swing 中的所有组件都是「绘制」出来的,每个组件在必要时可以绘制自己。 比如一个 Frame 组件被移动、改变大小、互相遮挡等情况下,会重新绘制自己,而这些绘图时机都是由系统掌控的,完全不需要你参与。

向 GUI 中添加各种组件,视觉上就是一个绘制过程。 其中要用到一个很重要的对象 Graphics,你可以把它理解为一个精密的数字画笔,可以使用各种颜色绘制线条、填充几何图形以及绘制图像等等。

既然窗口中看到的东西都是绘制出来的,那么是不是就是说我们也有机会绘制出自己的内容? 想法一点都没错,实际上很多动画、游戏都是在 GUI 中绘制出来的,而且也没有想象中的困难,接下来让我们来看看具体需要什么操作。

创建专属的绘图板

要想绘制自己的图形,首先要有自己的绘图板。 前面说过,Swing 组件都能绘制自己,那我们就继承一个适合绘制的组件,比如 JPanel,接管(覆盖)它的绘制方法 paintComponent(),写上我们自己的绘制代码。

记住,当组件移动、改变大小、遮挡等有可能破坏组件内容时,系统会自动调用 paintComponent() 方法,千万不要擅自调用! 正确做法是调用 repaint(),然后系统会去调用 paintComponent()

你也不要尝试去创建 Graphics 对象,因为 Graphics 是由系统负责管理的非常重要的设备,Windows 的所有视觉效果都与它有关。 当你需要绘制时,应该由系统交给你使用。

下面开始体验,首先自定义一个画板,然后把它添加到窗口中:

import java.awt.*;
import javax.swing.*;
public class SimpleFrame {
	// 初始化窗口,进行一些必要的设置
	private void init() {
		MyDrawPanel mdp = new MyDrawPanel(); // 创建画板
		JFrame frame = new JFrame();
		// 必要设置
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().add(mdp);
		frame.setSize(300, 300);
		frame.setVisible(true);
	}
	public static void main(String[] args) {
		new SimpleFrame().init();
	}
}
// 自定义的画板
class MyDrawPanel extends JPanel {
	// 覆盖 JPanel 的绘制方法,填充一个矩形
	public void paintComponent(Graphics g) {
		g.setColor(Color.ORANGE);		// 设置填充颜色
		g.fillRect(20, 50, 100, 100);	// 填充一个矩形,坐标 20,50,大小 100x100
	}
}

编译执行:
填充矩形
哈哈~~~ 看起来还不错。
继续,使用随机颜色填充一个椭圆形:

// 自定义的画板
class MyDrawPanel extends JPanel {
	// 覆盖 JPanel 的绘制方法,随机颜色填充一个椭圆形
	public void paintComponent(Graphics g) {
		int red = (int) (Math.random() * 255);
		int green = (int) (Math.random() * 255);
		int blue = (int) (Math.random() * 255);
		Color randomColor = new Color(red, green, blue);
		
		g.fillRect(0, 0, this.getWidth(), this.getHeight());
		g.setColor(randomColor);		// 设置填充颜色
		g.fillOval(70, 70, 100, 100);	// 填充一个椭圆形
	}
}

这次使用了随机颜色,每次运行都会由不同颜色填充。
填充圆形
再来,试一试绘制图像:

// 自定义的画板
class MyDrawPanel extends JPanel {
	// 覆盖 JPanel 的绘制方法,绘制一幅图像
	public void paintComponent(Graphics g) {
		Image img = new ImageIcon("jianqingyan.png").getImage();
		g.drawImage(img, 0, 0, this);
	}
}

编译执行:
绘制图片

赏心悦目,简直太漂亮了!

内容预告

下一篇文章,老白将继续介绍一个更好用的 Graphics2D 画笔,利用它你可以轻松地绘制出更加复杂的图形。


《 上一篇 第一个事件下一篇 神来之笔 Graphics2D 》
;