Java .drawImage : как отменить отрисовку или удалить изображение?

Мне нужно, чтобы определенное изображение постоянно перерисовывалось в разных местах во время работы программы. Поэтому я настроил цикл while, который должен перемещать изображение по экрану, но он просто перерисовывает изображение поверх самого себя снова и снова. Что я делаю не так? Есть ли способ удалить старое изображение, прежде чем рисовать его в новом месте?

        JFrame frame = buildFrame();

    final BufferedImage image = ImageIO.read(new File("BeachRoad_double_size.png"));

    JPanel pane = new JPanel() {
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            int num = 0;
            boolean fluff = true;
            while (fluff == true) {
            num = num + 1;
            g.drawImage(image, num, 0, null);
            if (num == 105) {
                fluff = false;
            }
            }
        }
    };


    frame.add(pane);

person Saucymeatman    schedule 25.07.2013    source источник
comment
Что вы, вероятно, захотите сделать, так это настроить метод paintComponent так, чтобы он просто рисовал в заданной точке и вызывал repaint() из другого места.   -  person Mike G    schedule 25.07.2013
comment
Извините, это не перманентный код, я просто пытаюсь понять некоторые вещи, прежде чем перейти к написанию практического кода.   -  person Saucymeatman    schedule 25.07.2013


Ответы (3)


Вы не можете запрограммировать цикл в методе paintComponent(). Код будет выполняться так быстро, что изображение будет нарисовано только в конечной позиции, которая в вашем случае должна быть с позицией x, равной 105.

Вместо этого вам нужно использовать Swing Timer, чтобы запланировать анимацию каждые 100 миллисекунд или около того. Затем, когда срабатывает таймер, вы обновляете позицию x и вызываете repaint() на панели. Дополнительные сведения см. в руководстве Swing по Использование таймеров Swing.

person camickr    schedule 25.07.2013

Помещение цикла while внутри метода paintComponent — не лучший способ сделать это. Вместо этого должны быть некоторые настройки, подобные следующим:

...
final int num = 0;
final JPanel pane;
Timer timer = new Timer(10, new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        num++;
        pane.repaint();
    }
});
pane = new JPanel() {
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, num, 0, null);
    }
});

timer.start();

Это будет перемещать изображение каждые 10 миллисекунд, как указано в конструкторе Timer.

person tbodt    schedule 25.07.2013
comment
@ user2619934 Вы хотите использовать javax.swing.Timer - person MadProgrammer; 26.07.2013
comment
1-10 миллисекунд могут быть слишком короткими для временного интервала; 2- Вы должны передать это как параметр ImageObserver для drawImage - person MadProgrammer; 26.07.2013

Это обычная проблема, с которой сталкиваются люди, начинающие заниматься анимацией, как и я. Вы не можете «удалить изображение» с экрана. Однако вы можете перерисовать весь экран, а затем перерисовать изображение в новом месте.

В псевдокоде:

while (condition)
   background(white); //or whatever color your background is
   drawImage(x,y);

Приведенный выше код очищает экран, поэтому вы можете безопасно перерисовывать изображение. Это эффективно «удаляет» ваше изображение.

Редактировать: я не читал ваш код, я только что ответил на ваш вопрос. Так что другие ответы, которые исправляют ваш код, вероятно, лучше моего.

person Undefined    schedule 25.07.2013
comment
Спасибо за объяснение этого простым для понимания общим способом. - person Saucymeatman; 26.07.2013