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