需要补习一下什么叫重载和GUI程序的基本知识1,JPanel中的paint方法应该是paint(Graphics g)
2, 虽然你新建了对象,但是还没有显示出来,你怎么调用这个paint方法

解决方案 »

  1.   

    楼上的大哥,看来我说不清楚,还是把原例给你看看把??
    /*这个是一个静态的时钟,本来这个已经画出了轮廓了,但是我还要根据自己的需要来设置分针,秒针,时针,这个时候就需要在paint方法里面加入三个int型的参数代表时间,但是当我把参数加进去,不知道如何调用paint方法,请指教啊*/
    import javax.swing.*;
    import java.awt.*;
    import java.util.*;
    public class ClockPanel extends JPanel{
    public ClockPanel(){
    super(); //调用父类的无参构造方法
    this.setSize(106,106); //设置钟板是个边长为66象素的正方形
    this.setBackground(Color.red);
    this.setVisible(true); }
    public void paint(Graphics g){
    int xcenter=53;
    int ycenter=53;
    g.setColor(Color.magenta); //设置颜色为黑色
    g.fillOval(0,0,106,106); //填充圆
    g.setColor(Color.cyan); //设置颜色为粉红
    g.fillOval(3,3,100,100); //在大圆上填充一个小圆
    g.setColor(Color.green);
    g.fillOval(18,18,70,70);
    //开始画点和时间点
    for(int i=5;i<61;i+=5)
    if(i!=15&&i!=30&&i!=45&&i!=60){
    int x=(int)(Math.cos(i*3.14f/30-3.14f/2)*45+xcenter);
    int y=(int)(Math.sin(i*3.14f/30-3.14f/2)*45+ycenter);
    g.setColor(Color.blue);
    g.drawString(".",x,y);
    }
    g.drawString("9",xcenter-45,ycenter+3);
    g.drawString("3",xcenter+40,ycenter);
    g.drawString("12",xcenter-8,ycenter-37);
    g.drawString("6",xcenter-3,ycenter+45);   }
    public static void main(String [] args){ //检测程序
    JFrame one =new JFrame("我的钟");
    one.setSize(300,300);
    Container con=one.getContentPane();
    con.setLayout(null);
    ClockPanel an=new ClockPanel(); con.add(an);
    an.setLocation(50,50);
    one.setVisible(true); }}
      

  2.   

    假如我重构了paint方法,如:public void paint(Graphics g,int a,int b)
    我如何调用这个方法????
      

  3.   

    你这里只是重载了paint方法,并不是重写,重写的话应该这样写
    public void paint(Graphics g)
    {
     super.paint(g);
     ……
    }
    调用paint方法是自动的,会在程序启动的时候同构造函数一起加载,或者在程序中间组件外观被破坏的时候(比如你的窗口最大最小化、被别的窗口遮盖了)也会自动调用。
    如果想自己调用paint方法的话,可以用repaint()方法来调用,不要直接调用paint()方法。
    这个问题我都回答过N遍了,快成专业户了,嘿嘿:)
      

  4.   

    再问个问题
    我知道piant方法是默认的,只要创建了该对象,然后显示出来对象,对象会自动的调用paint方法,但是我要是想把调用paint那一句写出来怎么写呢??
    比如one.paint(里面如何写???????);
      

  5.   

    如果重载了,那就直接调用呗。关键你的程序就是少了super.paint(g);这个东西
      

  6.   

    不是这样调用的:
    One.paint(//这个里面怎么样调用啊????);
    是这样调用的:
    One.repaint(); //这个方法会自动调用paint()这个方法.
      

  7.   

    angues1980(石头心) 
    大哥,那么要是里面paint是我写的一个有参数的方法,是不是也用repaint啊??
      

  8.   

    要是paint方法是我写的一个有参数的方法比如paint(Graphics g,int a),如何调用啊??
      

  9.   

    想让你的时钟走起来,加一个Threadpublic static void main(String [] args){ //检测程序
    JFrame one =new JFrame("我的钟");
    one.setSize(300,300);
    Container con=one.getContentPane();
    con.setLayout(null);
    final ClockPanel an=new ClockPanel();
    //加上这个
    new Thread(
      new Runnable(){
        public void run(){
          an.repaint();
          try{
            Thread.sleep(1000);
            }catch(Exception ex){}
        }
    }
    ).start(); con.add(an);
    an.setLocation(50,50);
    one.setVisible(true); }
      

  10.   

    不用啊,即然你自己写了一个paint(Graphics g,int a,int b),那你用对象调用One.paint(g1,a1,b1)传三个参掉用就行了,可以在重载的paint(Graphics g,int a,int b)方法里加上this.paint(g1)应该可以吧。
      

  11.   

    要是paint方法是我写的一个有参数的方法比如paint(Graphics g,int a),如何调用啊??
    ~~~~~~~~~~~~~~~~~~~paint方法是父类定义的只有一个Graphics对象参数的方法
    你不能用你的多加2个参数的方法来替换
    这个2个不同的方法
      

  12.   

    其实你这种机制真的很不推荐使用,干嘛非要传参调用呢,在类里声明基本类型成员int a,b;不是更好么。传来传去最后还要重载方法,从哪方面来说都不推荐。
      

  13.   

    To angues1980(石头心):
    import javax.swing.*;
    import java.awt.*;
    import java.util.*;
    public class ClockPanel extends JPanel{
    public ClockPanel(){
    super(); //调用父类的无参构造方法
    this.setSize(106,106); //设置钟板是个边长为66象素的正方形
    this.setBackground(Color.red);
    this.setVisible(true); }
    public void paint(Graphics g,int h,int m,int s){
    this.paint(g);
    int xcenter=53;
    int ycenter=53;
    g.setColor(Color.magenta); //设置颜色为黑色
    g.fillOval(0,0,106,106); //填充圆
    g.setColor(Color.cyan); //设置颜色为粉红
    g.fillOval(3,3,100,100); //在大圆上填充一个小圆
    g.setColor(Color.green);
    g.fillOval(18,18,70,70);
    //开始画点和时间点
    for(int i=5;i<61;i+=5)
    if(i!=15&&i!=30&&i!=45&&i!=60){
    int x=(int)(Math.cos(i*3.14f/30-3.14f/2)*45+xcenter);
    int y=(int)(Math.sin(i*3.14f/30-3.14f/2)*45+ycenter);
    g.setColor(Color.blue);
    g.drawString(".",x,y);
    }
    g.drawString("9",xcenter-45,ycenter+3);
    g.drawString("3",xcenter+40,ycenter);
    g.drawString("12",xcenter-8,ycenter-37);
    g.drawString("6",xcenter-3,ycenter+45);
    int xs=(int)(Math.cos(s*3.14f/30-3.14f/2)*45+xcenter); //利用三角公式求秒针的x坐标
    int ys=(int)(Math.sin(s*3.14f/30-3.14f/2)*45+ycenter); //利用三角公式求秒针的y坐标
    int xm=(int)(Math.cos(m*3.14f/30-3.14f/2)*40+xcenter); //利用三角公式求分针的x坐标
    int ym=(int)(Math.sin(m*3.14f/30-3.14f/2)*40+ycenter); //利用三角公式求分针的y坐标
    int xh=(int)(Math.cos((h*30+m/2)*3.14f/180-3.14f/2)*30+xcenter);
    int yh=(int)(Math.sin((h*30+m/2)*3.14f/180-3.14f/2)*30+ycenter);   }
    public static void main(String [] args){ //检测程序
    JFrame one =new JFrame("我的钟");
    one.setSize(300,300);
    Container con=one.getContentPane();
    con.setLayout(null);
    ClockPanel an=new ClockPanel();
    an.repaint();*******************************本来这里如果不写是个钟,写在什么都没有了,你看这个位置怎么改才能够调用上面的paint方法
    con.add(an);
    an.setLocation(50,50);
    one.setVisible(true); }}
      

  14.   

    angues1980(石头心) 
    哦,你提醒我了,谢谢啊,
    我都是自学得,很多地方都搞不清楚,
    总看到你现在帮人家解决问题,真是好人啊
    能否把你得MSN邮箱地址给我??交个朋友啊
    http://community.csdn.net/Expert/topic/3818/3818913.xml?temp=5.910891E-02
    进去这里吧,再给你20分
      

  15.   

    我原来贴过一个时钟的例子,你可以去看看
    http://community.csdn.net/Expert/topic/3779/3779025.xml?temp=.8223535
    你这种机制我强烈不推荐使用,如果你的int h,int m,int s是当前时间的话,可以用
    Calendar cal = Calendar.getInstance();
    int hours = cal.get(Calendar.HOUR);
    int minutes = cal.get(Calendar.MINUTE);
    int seconds = cal.get(Calendar.SECOND);
    直接在paint(Graphics g)方法里面得到
    如果是你设置的日期,那就应该给h,m,s设置成这个类的成员,这样也可以在重写的paint(Graphics g)方法里面调用。
      

  16.   

    overcast(http://blog.csdn.net/overcast) 
    大哥,也感谢你了