Пользовательская JPanel вызывает проблемы с рендерингом во второй пользовательской JPanel


Здесь немного странно. У меня есть два класса, расширяющиеся от JPanel, переопределяя paintComponent в обоих. Один реализует Runnable (для целей анимации).

Однако при использовании вместе с Runnable Сверху я получаю замечательную "нарисуйте копию всего, на что указывает мышь" на фоне экземпляра Runnable. Смотрите скриншоты ниже:

using_a_jpanel

использование пользовательского компонента

Единственное различие между ними заключается в том, что я использую JPanel в первом и обычай JPanel с фоновое изображение в последнем. Код для второго JPanel ниже:

package view.widgets;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class PaintedJPanel extends JPanel {

    private static final long serialVersionUID = 1L;
    private BufferedImage backgroundImage = null;

    public PaintedJPanel() {
        super();
    }

    public PaintedJPanel(File image) {
        super();
        try {
            backgroundImage = ImageIO.read(image);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void paintComponent(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        if(null != backgroundImage) {
            g2d.drawImage(backgroundImage, 0, 0, null);
        }
    }

    public BufferedImage getBackgroundImage() {
        return backgroundImage;
    }

    public void setBackgroundImage(BufferedImage backgroundImage) {
        this.backgroundImage = backgroundImage;
    }

}

EDIT : редактирование в деталях, потому что клавиша Enter не должна отправлять вопрос, когда я добавляю теги.

ЗАКОНЧЕНО РЕДАКТИРОВАНИЕ @ 13:38.

1 3

1 ответ:

Ах, ваш метод paintComponent пропускает вызов супер. Изменение

@Override
protected void paintComponent(Graphics g) {
    Graphics2D g2d = (Graphics2D) g;
    if(null != backgroundImage) {
        g2d.drawImage(backgroundImage, 0, 0, null);
    }
}

К

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    if(null != backgroundImage) {
        g2d.drawImage(backgroundImage, 0, 0, null);
    }
}

Как было отмечено в моих комментариях к вашему вопросу (до просмотра кода), без вызова super вы нарушаете цепочку рисования, что, возможно, приводит к побочным эффектам при рендеринге дочерних компонентов.