我有以下代码,用于从左上角到右下角设置球的动画。
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);
}
}
}
问题
anim.repaint()
内go
时,我从左上角到右下角都没有动画,但它会在路径上涂抹。但如果我更换它与frame.repaint()
我得到了一个移动的球所需的结果。这两个repaint
的调用有什么区别? anim.setBackground(Color.red);
方法中go
之后面板的颜色没有变化? 答案 0 :(得分:3)
); //为什么面板
的颜色不会变为红色
覆盖paintComponent(...)方法时,应始终调用super.paintComponent(g)
。默认代码负责绘制背景。
但它在路径上被涂抹了
与上述答案相同。你需要绘制背景,以便删除所有旧画。
球没有完全进入底部边缘
如果您的意思是球不在面板上的精确对角线上,那是因为您手动设置了框架的大小,而您没有考虑标题栏和边框的大小。如果您希望面板为(475,475),则覆盖面板的getPreferredSize()
方法以返回该尺寸。然后在您的代码中,用frame.pack()
替换frame.setSize()。