java Repaint()方法不调用draw()
基本上,我有一个界面形状,它有draw()
和animate()
方法。每个绘制形状的类都实现了这一点。还有一个类包含这些形状类中的arrayList
。还有一个单独的类包含我的JFrame。我有一个“Animate”按钮,它调用该arrayList
中的所有animate()
方法
我用的是netbeans
,意思是我没有错误。draw()
方法非常有效。我对动画有意见。我对它进行了调试,显然,repaint()
方法不调用其他任何东西,这就是为什么没有任何形状可以动画/移动。它找不到draw()
方法,因此不会重新绘制它
这是我的代码:
这是我的形状之一
public class Circle extends Canvas implements Shape{
int xpos, ypos, diam;
GradientPaint color;
public Circle(){
xpos = 103;
ypos = 88;
diam = 140;
color = new GradientPaint(0, 0, new Color(204, 204, 254),
120, 100, new Color(255, 255, 255), true);
}
@Override
public void draw(Graphics g){
Graphics2D g2 = (Graphics2D)g;
g2.setPaint(color);
g.fillOval(xpos, ypos, diam, diam);
}
@Override
public void animate(){
xpos += 10;
ypos += 10;
repaint();
}
}
这包含我的形状数组列表
public class ShapeCanvas extends Canvas { private ArrayList list; public ShapeCanvas(){ setBackground(Color.WHITE); setSize(1000, 700); list = new ArrayList<>(); Circle circle = new Circle(); list.add(circle);} //calls all draw() method @Override public void paint(Graphics g){ for (int i = 0; i < list.size(); i++){ list.get(i).draw(g); } } //this method calls all animate() method public void animateAll(){ for (int i = 0; i < list.size(); i++){ list.get(i).animate(); } }
}
这是我的JFrame
public class Animation extends JFrame{ public Animation(){ setLayout(new BorderLayout()); final ShapeCanvas sc = new ShapeCanvas(); JButton animate = new JButton("Animate"); animate.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent ae){ sc.animateAll(); } }); add(sc, "Center"); add(animate, "South"); } public static void main(String[] args) { Animation g = new Animation(); g.setVisible(true); g.setSize( 1000, 700 ); g.setTitle( "Animation" ); g.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); g.setResizable(false); } }
我尝试过使用JPanel
或JLayeredPane
,尝试过使用revalidate()、validate()、甚至invalidate()
。许多人建议使用调用super的paintComponent()。paintComponent(),但是有没有办法不删除/替换draw()
方法就可以完成这项工作呢??虽然,我可能只是错过了一些重要的细节
显然,很多人已经在这里问过这个问题,我读过其中的大部分。很抱歉我被解雇了。但任何帮助或建议都将不胜感激
编辑: 我修好了! 谢谢大家
# 1 楼答案
我知道你的编辑说你已经修复了它,但我想确保并指出OP中代码的问题。
Circle
,据我所知,不应该扩展Canvas
。在“动画”中,它调用“重绘”,但重绘没有任何作用,因为它没有作为组件添加到任何地方修正看起来像这样:
顺便说一句,我也同意@AndrewThompson的观点,即几乎没有理由在挥杆时使用AWT。尤其是如果你想把两者混合在一起,不要这样做