Java Перерисовать одно изображение

Я рисую много буферизованных изображений на JFrame, используя метод paint(),

public void paint(Graphics g){
        super.paint(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.drawImage(bufferedImg, x, y, layeredPane);
        ...More images
    }

Проблема в том, что он перерисовывает все изображения, поэтому экран становится пустым, а затем отображает изображения. Мне нужно перерисовать одно изображение, а не все в методе рисования. Поэтому я попытался выделить другой метод, а не метод рисования, и просто вызвать его.

public void drawImage(){
    Graphics2D g2d = (Graphics2D) getGraphics();

    if (condition == true) g2d.drawImage(bufferedImg, x, y, layeredPane);
}

И это работает для рисования изображения, но как только логическое значение установлено в false и вызывается, оно все еще сохраняет изображения на экране. Извините, если это было опубликовано ранее, я видел довольно много сообщений о перерисовке изображений в Java, но я не смог найти ни одного, которое конкретно перерисовывало бы одно изображение.


person user3211158    schedule 26.01.2014    source источник


Ответы (1)


  1. Если ваша программа является Swing-программой, то вам следует переопределять не paint, а paintComponent(...) класса, производного от JComponent.
  2. Вы можете ограничить расположение перекрашенной области, вызвав repaint(Rectangle r), при этом границы прямоугольника будут границами области, которую вы хотите изменить.
  3. Вы не должны получать контекст Graphics, вызывая getGraphics() для компонента, так как это даст вам только недолговечный объект Graphics, и все, что нарисовано с его помощью, будет потеряно при перерисовке.
  4. Если многие из ваших изображений не меняются, если они действуют как фон, подумайте о том, чтобы нарисовать их в одном фоновом BufferedImage, а затем нарисовать его в своем методе paintComponent(...).

Для получения дополнительной справки рассмотрите возможность создания и публикации минимального, компилируемого, исполняемого примера программы.


Изменить
О вашем новом сообщении:

Я рисую много буферизованных изображений на JFrame, используя метод paint()

Нет, никогда не рисуйте непосредственно в JFrame, поскольку вы теряете многие преимущества графики Swing, включая двойную буферизацию, и рискуете испортить отрисовку границ и дочерних компонентов. Чтобы узнать Подробнее о том, как правильно рисовать.

person Hovercraft Full Of Eels    schedule 26.01.2014
comment
Большое спасибо, это очень полезно. И да, это сделано в JFrame, я отредактировал свой пост. - person user3211158; 27.01.2014