Java-графика нарисована поверх существующей графики

62
4

Основной класс:

    public Main() {
Frame f = new Frame();
final Panel p = f.p;

final Player player = new Player();

Timer t = new Timer(UPDATE_PERIOD, new ActionListener() {
public void actionPerformed(ActionEvent e) {
Graphics g = p.getGraphics();
p.render(g);

player.tick();
player.render(g);

g.dispose();
}
});
t.start();
}

Метод рендеринга игрока:

public void render(Graphics g) {
g.drawImage(Images.get("player"), x, y, null);
}

Проблема в том, что все предыдущие обратные изображения все еще существуют. Пример (когда я меняю обрамленное изображение x или y): screenshot

спросил(а) 2020-03-12T18:30:20+03:00 1 год, 1 месяц назад
1
Решение
76

Чтобы рисовать в Swing, вы не должны получать объект Graphics непосредственно из JPanel. Вместо этого переопределите метод paintComponent и используйте параметр Graphics для выполнения вашего пользовательского чертежа с вызовом родительского метода для удаления предыдущей картины

@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
//custom painting goes here
}

Если вы хотите вызвать перерисовку, используйте метод с этим именем в JPanel:

p.repaint();

ответил(а) 2020-03-12T18:44:23.838674+03:00 1 год, 1 месяц назад
75

Вместо того, чтобы делать свой собственный таймер, вы действительно должны делать всю свою картину в своем методе paintComponent. Что-то вроде:

   public void actionPerformed(ActionEvent e) {            
player.tick();
p.repaint();
}

А затем повторно разверните плеер и фон в paintComponent()

В процессе рисования, как и в настоящее время, возникают проблемы при изменении размера панели и т.д.

ответил(а) 2020-03-12T18:30:20+03:00 1 год, 1 месяц назад
45

Попробуйте вызвать "p.repaint()" в своем ActionListener, как только вы измените положение графика.

ответил(а) 2020-03-12T18:30:20+03:00 1 год, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема