当前位置: 首页 > 知识库问答 >
问题:

Repaint()方法不调用draw()

宋臻
2023-03-14

基本上,我有一个接口形状,它具有draw()animate()方法。绘制形状的每个类都实现了这一点。还有一个类包含这些形状类的arraylist。然后有一个单独的类包含我的JFrame。我有一个“动画”按钮,它调用ArrayList中的所有Animate()方法。

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

我试过使用JPanelJLayeredPane,试过使用revalidate()、validate(),甚至invalidate()。许多人建议使用一个调用super.paintComponent()的paintComponent(),但是有没有什么方法可以在不删除/替换draw()方法的情况下做到这一点?不过,我可能错过了一些重要的细节。..

显然,很多人已经问过这个问题了,我也读过其中的大部分。我很抱歉多此一举。但任何帮助或建议都非常感谢!

编辑:我修好了!谢谢你们,伙计们!

共有1个答案

谷梁卓
2023-03-14

根据我的理解,(这仅限于我上学期上的课)您需要重写paintComponent并调用子组件的draw函数。repaint()调用PaintComponent。

下面是我教授上学期给出的示例代码。我发现他的代码很清晰,很容易从。http://students.cs.byu.edu/~cs240ta/fall2013/rodham_files/week-09/graphics-programming/code/drawing/src/noevents/drawingcomponent.java

 类似资料:
  • 对于我的程序,我目前希望使用open按钮打开JFileChooser并选择一个图像,然后在applet左侧的JPanel上绘制它,我知道该文件正在被检索,但当我重新绘制图形上下文时,什么也没有发生。提前谢了。

  • 在试图制作一个非常简单的子弹地狱游戏来学习java时,我遇到了一个障碍: repaint()没有调用油漆组件()。 这是整个程序,目前只需将我每秒创建50次的图像绘制到JFrame上的JPanel上。 在使用断点和println方法进行了一些调试之后,我可以确认正在读取正确的图像,gameTimerAction中的计时器每秒被调用50次,并且repaint()根本没有调用paintComponen

  • 问题内容: 每当我尝试调用repaint()方法时,都会说不能从静态方法引用非静态方法。顺便说一句,它与paintComponent方法在同一类中。我尝试首先在类之外创建一个对象,然后使用对象名称引用它,但是它也没有用。请帮忙。 问题答案: 主要方法是静态的。您的p对象不是:它是P类的实例字段。试试这个: 您应该始终从事件分发线程访问Swing组件,这就是为什么我将它们全部放在EventQueue

  • 我想做一个象棋游戏,我想在游戏循环中的一个jFrame上调用方法。这个特殊的JFrame显示了每个玩家的总击杀数。我很确定确实调用了repaint(),但由于某种原因,它似乎没有正确更新我的jlabel,jlabel应该保存每个玩家的击杀数值。 这是我为自定义JFrame扩展类编写的代码,该类包含代表kill的JLabel。 然后我只是在不同类的main方法中调用这个框架的repaint(): 非

  • 我已经花了几天时间试图让Graphics2D类在我的代码中工作。我把它的结构化为这样一种方式,即当注册了一个单击事件时,调用reaint()就完成了,但是当它到达调用repaint()的阶段时,这只会产生一个空指针异常。 调试时,这一切都在按预期工作,而不是从油漆组件方法中调用,但是当试图使用油漆组件和reaint()正确调用代码以允许Graphics2D类显示每个点的行时,它不起作用。 我已经包

  • 首先,请不要因为创建一个问题而将我置于火刑柱上,而其他具有类似名称和内容的人却存在。我把它们都看了一遍,但没有找到解决办法。 调用repaint()绝对不会调用paintComponent(),不管我似乎尝试了什么。下面是与问题相关的所有代码: 按照预期,“创建的级别面板和设置的内容窗格”被打印到控制台。 从不打印“油漆组件级油漆”。“计时器重新绘制”每2秒打印一次,正如预期的那样。