重绘功能弄乱了整个框架

Repaint function messes up the whole frame

尝试在 Swing 中使用 paint 方法绘制一些元素时遇到问题。 正如标题所说,我的整个框架崩溃了,并做了一些奇怪的重复。

我制作了一个单独的 JPanel,以便我可以操作绘制的形状:

public class PanelPovrsina extends JPanel{

private ArrayList<Oblik> listaOblika;

public PanelPovrsina() {    
    // svi oblici
    this.listaOblika = new ArrayList<Oblik>();
    this.listaOblika.add(new Kvadrat(new Tacka(50, 50), 50, "zuta", "crvena"));
    this.setBackground(Color.WHITE);
    this.setVisible(true);
}

public void paint(Graphics g) {
    if(this.listaOblika.isEmpty()) return; 
    Iterator<Oblik> it = this.listaOblika.iterator();
    while(it.hasNext()) {
        it.next().crtajUBoji(g);
    }
    repaint(); // this causes problems!
}

public ArrayList<Oblik> getListaOblika() {
    return this.listaOblika;
}

}

这是带有此代码的框架:

这里没有重绘方法:

不,我知道重绘方法对于动态添加形状和实际绘制是必不可少的,但我无法使其正常工作。

另外,从上面的代码可以看出,面板的背景设置为白色,但我的框架不会渲染它。

希望有足够的信息来解决我的问题,如果没有,我会添加我的 JFrame 的代码!

谢谢!

您永远不应覆盖 paint 方法,因为它在幕后处理许多其他事情。您应该改写 paintComponent

正如@Joe C 回答的那样,我应该一直在使用 paintComponent 方法,而不是绘画!工作代码:

public class PanelPovrsina extends JPanel{

private ArrayList<Oblik> listaOblika;

public PanelPovrsina() {
    // svi oblici
    this.listaOblika = new ArrayList<Oblik>();
    this.listaOblika.add(new Kvadrat(new Tacka(50, 50), 50, "zuta", "crvena"));
    this.setBackground(Color.PINK);
    this.setVisible(true);
}


@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    for (Oblik obl : this.listaOblika) {
        obl.crtajUBoji(g);
    }

    repaint();
}

public ArrayList<Oblik> getListaOblika() {
    return this.listaOblika;
}

}