JComponent永久重绘

时间:2017-11-07 16:35:51

标签: java swing out-of-memory repaint jcomponent

所以我有一个JFrame,带有一些Buttons和一个JComponent来绘制。我加载一些Images并在JComponent中绘制1st。现在我的问题是我的JComponent,我第一次画画时,是永久重画,几秒钟后我得到一个OutOfMemoryError ...... 我认为g.drawImage(...)是问题所在,因为如果我发表评论,就不再有无限循环:

@Override
public void paintComponent(Graphics g){
    System.out.println("Test");
    if(!images.isEmpty()){
        Image img = activeImage.img.getScaledInstance(middleImage.getWidth(), middleImage.getHeight(), Image.SCALE_SMOOTH);
        if(mode != 0){
            if(mis != null){
                img = createImage(mis).getScaledInstance(middleImage.getWidth(), middleImage.getHeight(), Image.SCALE_SMOOTH);                      
            }
        }
        g.drawImage(img, 0, 0, this);
    }
}

1 个答案:

答案 0 :(得分:0)

你实际上并没有画任何东西,而setBounds会调用invalidate(调用repaint)

所以这个块:

    newImage.setBounds(560, 640 + this.getHeight()-720, 720 + this.getWidth()-1280, 40);
    scrollRoom.setBounds(0, 0, 437, this.getHeight());
    middleImage.setBounds(560, 0, this.getWidth()-560, this.getHeight()-80);
    autoFade.setBounds(436, 0, 124, 100);
    createHistogram.setBounds(436, 100, 124, 100);
    imageMorphology.setBounds(436, 200, 124, 100);
    editImage.setBounds(436, 300, 124, 100);
    endActiveMode.setBounds(436, this.getHeight() - (720-573), 124, 100);   

必须在setVisible(true)

之前移动到构造函数

你不需要覆盖绘画(图形)

第二个问题是你的线程,通过调用run你在主线程上执行它,而是调用:

super.start();