Java Repaint()不';行不通

Java Repaint()不';行不通,java,swing,jpanel,Java,Swing,Jpanel,不知怎的,当我尝试调用它时,重新绘制不起作用。它没有给出错误,看起来只是忽略了整个函数 这是我的密码: public class Neerslag extends JComponent { JPanel painting = new JPanel(); private int j = 0; Neerslag() { setPreferredSize(new Dimension(370, 200)); } public void paintComponent(Graphic

不知怎的,当我尝试调用它时,重新绘制不起作用。它没有给出错误,看起来只是忽略了整个函数

这是我的密码:

public class Neerslag extends JComponent {
JPanel painting = new JPanel();
private int j = 0;

  Neerslag() {
    setPreferredSize(new Dimension(370, 200));
  }

  public void paintComponent(Graphics g) {
    super.paintComponent(g);

    g.setColor(Color.GRAY);

    g.fillOval(j, 20, 100, 20);
    g.fillOval(j + 10, 30, 100, 20);
    System.out.println("test2");

  }

  public void move(int j) {
    System.out.println("test");
    if (j < 50) {
        j++;
    } else {
        j = -j;
    }
    /*try {
        Thread.sleep(500);
    } catch (InterruptedException e) {
        System.err.println("sleep exception");
    }*/
    this.repaint();
  }

  public JPanel showPaint() {
    painting.add(new Neerslag());
    return painting;
  }

  public void Clear() {
    painting.repaint();
    System.out.println("hello");
  }
}
我错过了什么?它确实显示了最初的两个椭圆形,但在我更改了“j”值后,就不会重新绘制它们。
提前谢谢你

repaint
并不是你真正想要的,你“似乎”想要的是
revalidate
repaint

类似于

@Override
public void mouseClicked(MouseEvent arg0) {
    neerslag.move(i);
    i++;
    neerslag.revalidate();
    neerslag.repaint();
    this.add(neerslag.showPaint());
}
比如说

现在,值得一提的是,您的设计似乎是倒退的,也就是说,与其使用
Neerslag
容器,还不如使用其他容器来添加自身的实例,相反
Neerslag
应该只关心自身,而不关心其他


您应该将
绘图
面板移出并单独管理,因为
Neerslag
根本不应该关心它-IMHO

为什么要将
Neerslag
添加到
JPanel
?为什么不直接添加
Neerslag
?每次调用
showPaint
,您都在创建一个
Neerlsag
的新实例,当调用
neerslaf.repaint
时,您正在重新绘制
JPanel
…?首先:感谢您的建议。我尝试过这个解决方案,尽管它不起作用。问题是,paintcomponent不会再次运行。它只在程序开始时运行一个。我用system.out.println(“test2”)来测试这一点。看来这就是问题所在。我现在也将代码更改为您在评论中所说的内容。为我将大量输出转储到控制台(尝试调整窗口大小)。您使用的是什么版本的Java和OS。如前所述,您当前正在重新绘制面板,而不是Neerslag组件。重新绘制是一个请求,重新绘制管理器完全有权忽略itRight,不知何故,它现在正在为我工作。非常感谢。
@Override
public void mouseClicked(MouseEvent arg0) {
    neerslag.move(i);
    i++;
    neerslag.revalidate();
    neerslag.repaint();
    this.add(neerslag.showPaint());
}