Graphics类使用的解释与思考

1 篇文章 0 订阅
1 篇文章 0 订阅

Graphics类说明

        该类的所在的包为java.awt,也就是说这是一个用于GUI界面设计的类。根据API中Graphics类的声明为:

public abstract class Graphics extends Object

        即该类为抽象类,注意!!!无法直接生成实例对象,这个很关键,正常来说初学的思路大概就是生成一个实例变量g,然后用g调用Graphics类中的方法来实现绘图的功能。但是不能new出一个Graphics对象来,怎么用它绘图呢?

思路一:getGraphics()方法

        首先思考这么一个问题,为什么设计者要把Graphics类设计成抽象的呢?通常来说,我们认为有不确定的、需要在子类重写的方法,才会把一个类设计成抽象类。
        我们对比getGraphics()方法来看:

public Graphics getGraphics();

        Creates a graphics context for this component. This method will return null if this component is currently not displayable.
        什么意思???迷惑了!Graphics不是抽象类吗,凭什么getGraphics()就可以creates一个Graphics类的实例变量。继续思考,调用getGraphics()方法的时候肯定是知道当前组件(component)的。
        那或许这个问题可以得到解释:尽管对于Graphics类来说,看似drawLine(),drawString()等这些绘图的方法都是确定的,但是绘图的对象——当前组件未知的情况下是无法生成对应实例变量的,即组件未知时Graphics类的一些方法是不确定的。
        OK,到这里那我们就可以试一下用它来绘图了,代码如下:

package Rwenki.Tests;

import javax.swing.JFrame;

public class MyGraphics {
	public static void main(String[] args) {
		JFrame jFrame = new JFrame();
		jFrame.setVisible(true);
		jFrame.setBounds(0, 0, 500, 500);
		int x = jFrame.getWidth();
		int y = jFrame.getHeight();
		jFrame.getGraphics().drawString("I am Rwenki", x/2, y/2);
		jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}

        这里有一个问题需要注意!必须先将jFrame的Visible属性设置为true才能调用getGraphics()方法,否则返回值为null。
        但是!事情还没完,跑一下,运行结果如下:
It seems that your code do nothing......
        不能轻易放弃,调试一下看看,当执行完drawString那关键的一行的时候,奇迹发生了:
Miracle         跟预想的一样,确实成功实现了drawString()的效果,但是为什么直接运行显示的是一片空白呢?在回答之前,我们先看一下使用Graphics类来绘制的第二个思路。

思路二:paint(Graphics g)方法

        事实上,我们通常是用paint(Graphics g)、paintComponent(Graphics g)和repaint(Graphics g)这几个方法来绘图的。在JPanel、JFrame中都有上述方法,它们都是这样的:

public void method_name(Graphics g);

        并且,paint(Graphics g)、paintComponent(Graphics g)方法不需要显式地调用,JFrame、JPanel的实例变量会自动调用不断更新。这里也回应了关于Graphics抽象类的问题,在这些确定的组件中,它们的这些paint(Graphics g)等方法都将对应的Graphics实例变量g作为参数传入。
        同时,这里也是在回答之前的问题,为什么语句jFrame.getGraphics().drawString(“I am Rwenki”, x/2, y/2);在执行了程序后没有显示出应有的效果,在debug调试完这一行时却能正常显示,原因就在与直接执行程序时,jFrame自动调用了它的paint()方法更新了界面,这个时候paint(Graphics g)方法没有重写,会自动调用,用它的Graphics对象g重新绘制一块白布!覆盖掉我们想要显示的String。当然,想按照思路一继续在JFrame的外部使用Graphics,也有办法,可以通过线程,也不断更新重绘我们想要的String就可以了!此处按下不表。
        最后在做一点思考,jFrame自动调用paint(Graphics g)方法的参数g是哪里来的?我认为是jFrame内部就有的,JFrame应该是在它的构造方法或者通过它的构造方法,最终能不断调用paint(Graphics g)方法,并且在生成JFrame的实例对象,应该也在其内部也生成了Graphics的实例成员。
        以上都是我根据所学知识,试图解释遇见到的问题的思考与猜测,如有错误之处,希望可以指正,不胜感激!

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值