有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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); } }

我尝试过使用JPanelJLayeredPane,尝试过使用revalidate()、validate()、甚至invalidate()。许多人建议使用调用super的paintComponent()。paintComponent(),但是有没有办法不删除/替换draw()方法就可以完成这项工作呢??虽然,我可能只是错过了一些重要的细节

显然,很多人已经在这里问过这个问题,我读过其中的大部分。很抱歉我被解雇了。但任何帮助或建议都将不胜感激

编辑: 我修好了! 谢谢大家


共 (1) 个答案

  1. # 1 楼答案

    我知道你的编辑说你已经修复了它,但我想确保并指出OP中代码的问题。Circle,据我所知,不应该扩展Canvas。在“动画”中,它调用“重绘”,但重绘没有任何作用,因为它没有作为组件添加到任何地方

    修正看起来像这样:

    class Circle implements Shape {
        @Override
        void animate() {
            /* only set positions */
        }
    }
    
    class ShapeCanvas extends Canvas {
        @Override
        void animateAll() {
            for(/* all shapes */) {
                /* call shape.animate() */
            }
    
            /* repaint this Canvas */
            repaint();
        }
    }
    

    顺便说一句,我也同意@AndrewThompson的观点,即几乎没有理由在挥杆时使用AWT。尤其是如果你想把两者混合在一起,不要这样做