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的例子谢谢

解决方案 »

  1.   

    java命名规范 cut首字母应该大写
    paint方法不报错,实际原因是你Cut继承JFrame类,这个paint方法实际上是重写了paint方法,没有语法错误自然一切正常。
    打开两句之后提示的指针异常是因为getGraphics()方法返回对象为null,然后你再调用paint方法的null对象的方法就报错最后一个问题无法一两句话说清楚,repaint是UI图形有变化之后的重绘组件方法,paint是普通的绘图组件,这两者的功能设计目的不一样,update也是UI图形有变化后的重绘方法你上面程序的paint重写是有问题的,需要添加一行命令
    package csdn;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) {
    super.paint(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(); }}
      

  2.   

    可否不继承框架类绘图,我改了一下,但是没能实现
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;public class App14_2//没有继承框架类
    {
        static JFrame frm = new JFrame();
        static JPanel panel = new JPanel();
        int circle = 0;
        public App14_2()
        {
    frm.setBounds(300, 200, 350, 370);
    frm.setLayout(new BorderLayout());
    frm.add(panel);
    panel.setLayout(new FlowLayout());
    frm.setDefaultCloseOperation(3);
    frm.setVisible(true);
    Graphics g = frm.getGraphics();//试图获取绘图区域
    paint(g);//传递绘图区域
        }
        public void paint(Graphics g)
        {
    g.drawString("花园或椭圆", 120, 250);
    g.drawOval(70, 160, 70, 70);
    g.drawOval(150, 220, 70, 120);
        }
        public static void main(String[] args)
        {
    new App14_2();
        }
    }
      

  3.   

    你如果想要自己彻底写一个类,自己写一个paint方法,而不是使用super.paint()方法第一,你做这种思考对理解代码有意义,但是实际很少有这样做第二,如果你想要这样做,那实际就是自己实现一个 底层的UI元素,在自定义的paint(Graphics)当中除了你自己的方法实现之前,必须要 同样的调用 JFrame.paint()方法的内部各种方法,具体是什么需要看JDK的源码。你现在的这个第二个程序的实现大思路不是SWING开发的凡例,已经走偏了,正常一些的实现 就是上面给你的例子,当然可以再改进优化。