【问题标题】:Repaint function messes up the whole frame重绘功能弄乱了整个框架
【发布时间】:2018-01-14 10:34:30
【问题描述】:

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

我制作了一个单独的 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;
}

}

这是带有此代码的框架:

这里没有重绘方法:

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

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

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

谢谢!

【问题讨论】:

  • 首先,您永远不应该覆盖paint 方法。您应该改写paintComponent。其次,正如您所发现的,永远不应该在 paint 方法(或它调用的任何方法)中调用 repaint()
  • 谢谢,使用paintComponent 解决了我的问题!

标签: java swing jframe jpanel paint


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-28
      • 1970-01-01
      • 2019-06-11
      • 2016-10-23
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      相关资源
      最近更新 更多