重绘功能会弄乱整个画面

时间:2018-01-14 10:34:30

标签: java swing jframe jpanel paint

尝试使用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;
}

}

以下是包含此代码的框架:

enter image description here

这里没有重绘方法:

enter image description here

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

另外,正如您从上面的代码中看到的那样,面板背景设置为白色,但我的框架无法渲染它。

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

谢谢!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

当@ 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;
}

}