使用Graphics绘图简单例子问题
importjava.awt.*;importjavax.swing.*;importjava.awt.event.*;publicclasscutextendsJFra...
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class cut extends JFrame
{
static JPanel panel = new JPanel();
static JButton but1 = new JButton("draw 圆");
static JButton but2 = new JButton("draw 椭圆");
static int circle = 0;
public cut()
{
setBounds(300, 200, 350, 370);
setLayout(new BorderLayout());
add(panel);
panel.setLayout(new FlowLayout());
panel.add(but1);
panel.add(but2);
setDefaultCloseOperation(3);
// Graphics g = getGraphics();
// paint(g);
setVisible(true);
}
public void paint(Graphics g)
{
g.drawString("花园或椭圆", 80, 80);
g.drawOval(70, 160, 70, 70);
g.drawOval(150, 160, 70, 90);
}
public static void main(String[] args)
{
new cut();
}
}
看了书上例子后我有很多不解,比如:
1、我把那两句注释了,没有了g,为什么paint函数不会报错,照样运行?
2、打开那两句后提示3处指针异常?
3、提示一个区别paint,repaint,update的例子
谢谢 展开
import javax.swing.*;
import java.awt.event.*;
public class cut extends JFrame
{
static JPanel panel = new JPanel();
static JButton but1 = new JButton("draw 圆");
static JButton but2 = new JButton("draw 椭圆");
static int circle = 0;
public cut()
{
setBounds(300, 200, 350, 370);
setLayout(new BorderLayout());
add(panel);
panel.setLayout(new FlowLayout());
panel.add(but1);
panel.add(but2);
setDefaultCloseOperation(3);
// Graphics g = getGraphics();
// paint(g);
setVisible(true);
}
public void paint(Graphics g)
{
g.drawString("花园或椭圆", 80, 80);
g.drawOval(70, 160, 70, 70);
g.drawOval(150, 160, 70, 90);
}
public static void main(String[] args)
{
new cut();
}
}
看了书上例子后我有很多不解,比如:
1、我把那两句注释了,没有了g,为什么paint函数不会报错,照样运行?
2、打开那两句后提示3处指针异常?
3、提示一个区别paint,repaint,update的例子
谢谢 展开
2个回答
展开全部
paint(g) ,一个回调方法,绝大多数时候组件的绘图逻辑都存储于这个方法中。awt系统会在适当的时候调用这个方法对组件进行绘图。容器在绘制的时候,容器的paint(g)方法默认会显示通知在容器中存在的所有visible为true的子组件进行绘制.
awt调用这个方法有2种形式。程序驱动方式和系统驱动方式。
在系统驱动的情况下(比如界面第一次显示组件),系统会判断组件的显示区域,然后向事件分发线程发出调用paint(g)的命令.
程序驱动则由外部的程序调用repaint()方法提出一个异步请求.repaint方法会调用update(g)法,update方法在默认情况下简单调用paint(g)方法.从而绘制组件.
一般不提倡将组件的具体绘制逻辑放到paint(g)之外,也不提倡程序直接调用paint(g)方法.需要注意的是,由于程序驱动方式是由程序来负责组件的绘制,所以repaint方法拥有几个重载方法.传入绘制区域,由程序决定组件的绘制区域.
update(g)方法.在awt的重量级组件上,update是一个很重要的方法.在外部程序调用repaint的时候,都会调用到update.程序员通过继承重量级组件,覆盖这个update方法.可以实现自己的绘图逻辑,典型的用法是重新绘制组件需要改变的的一部份而不是全部(增量绘图).
//以上为引用网友
你重新frame的paint方法 并调用
setVisible(true);,明显是系统驱动方式来绘制图形,是不需要手动实例化Graphics 对象和手动调用paint方法的,系统会自动调用。
awt调用这个方法有2种形式。程序驱动方式和系统驱动方式。
在系统驱动的情况下(比如界面第一次显示组件),系统会判断组件的显示区域,然后向事件分发线程发出调用paint(g)的命令.
程序驱动则由外部的程序调用repaint()方法提出一个异步请求.repaint方法会调用update(g)法,update方法在默认情况下简单调用paint(g)方法.从而绘制组件.
一般不提倡将组件的具体绘制逻辑放到paint(g)之外,也不提倡程序直接调用paint(g)方法.需要注意的是,由于程序驱动方式是由程序来负责组件的绘制,所以repaint方法拥有几个重载方法.传入绘制区域,由程序决定组件的绘制区域.
update(g)方法.在awt的重量级组件上,update是一个很重要的方法.在外部程序调用repaint的时候,都会调用到update.程序员通过继承重量级组件,覆盖这个update方法.可以实现自己的绘图逻辑,典型的用法是重新绘制组件需要改变的的一部份而不是全部(增量绘图).
//以上为引用网友
你重新frame的paint方法 并调用
setVisible(true);,明显是系统驱动方式来绘制图形,是不需要手动实例化Graphics 对象和手动调用paint方法的,系统会自动调用。
展开全部
非标准答案:
1、
paint函数里那个括号里有个局部变量Graphics g看到了吗?重载paint函数后awt系统会在适当的时候调用这个方法对组件进行绘图
2、
3处指针异常? 什么异常,就在运行的时候会报nullException错,说g为null,正常,因为awt里控件JFrame没有graphics,你调用的getGraphics是继承自它的父类compe..那个东西的,所以为空,只能用paint里自带的Graphics
3、
上面那个人讲的很清楚了已经。
1、
paint函数里那个括号里有个局部变量Graphics g看到了吗?重载paint函数后awt系统会在适当的时候调用这个方法对组件进行绘图
2、
3处指针异常? 什么异常,就在运行的时候会报nullException错,说g为null,正常,因为awt里控件JFrame没有graphics,你调用的getGraphics是继承自它的父类compe..那个东西的,所以为空,只能用paint里自带的Graphics
3、
上面那个人讲的很清楚了已经。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询