Пользовательская JPanel вызывает проблемы с рендерингом во второй пользовательской JPanel
Здесь немного странно. У меня есть два класса, расширяющиеся от JPanel
, переопределяя paintComponent
в обоих. Один реализует Runnable
(для целей анимации).
Однако при использовании вместе с Runnable
Сверху я получаю замечательную "нарисуйте копию всего, на что указывает мышь" на фоне экземпляра Runnable
. Смотрите скриншоты ниже:
Единственное различие между ними заключается в том, что я использую 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 ответ:
Ах, ваш метод 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 вы нарушаете цепочку рисования, что, возможно, приводит к побочным эффектам при рендеринге дочерних компонентов.