Jpanel和Jframe的重绘方法有何不同?

时间:2014-07-23 19:38:05

标签: java swing animation background paintcomponent

我有以下代码,用于从左上角到右下角设置球的动画。

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
class MainFrame{ 
    int i=0,j=0;
    JFrame frame = new JFrame();
    public void go(){   
         Animation anim = new Animation();
         anim.setBackground(Color.red);//Why color is not changing to red for the panel.
         frame.getContentPane().add(anim);
         frame.setVisible(true);
         frame.setSize(475,475);
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         for(i=0,j=0;i<frame.getHeight()&&j<frame.getWidth();++i,++j){
               anim.repaint();//Main problem is here,described below.
               try{
                   Thread.sleep(50);
               }
               catch(Exception ex){}
         }
    }
    public static void main(String[] args) {
         MainFrame mf = new MainFrame();
         mf.go();
    }

    class Animation extends JPanel{
         public void paintComponent(Graphics g){
             Graphics2D g2d = (Graphics2D)g;
             g.fillOval(i,j,25,25);
         }
    }
}

问题

  1. 当我在方法anim.repaint()go时,我从左上角到右下角都没有动画,但它会在路径上涂抹。但如果我更换它与frame.repaint()我得到了一个移动的球所需的结果。这两个repaint的调用有什么区别?
  2. 为什么在anim.setBackground(Color.red);方法中go之后面板的颜色没有变化?
  3. 如果你运行这个程序,你会发现球并没有完全位于底部边缘,所以我怎么能够实现呢?

1 个答案:

答案 0 :(得分:3)

  

); //为什么面板

的颜色不会变为红色

覆盖paintComponent(...)方法时,应始终调用super.paintComponent(g)。默认代码负责绘制背景。

  

但它在路径上被涂抹了

与上述答案相同。你需要绘制背景,以便删除所有旧画。

  

球没有完全进入底部边缘

如果您的意思是球不在面板上的精确对角线上,那是因为您手动设置了框架的大小,而您没有考虑标题栏和边框的大小。如果您希望面板为(475,475),则覆盖面板的getPreferredSize()方法以返回该尺寸。然后在您的代码中,用frame.pack()替换frame.setSize()。