【老白学 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 》 |
---|