Рисование строк поверх PaintedImage Java

Мне нужно нарисовать строки на нарисованном изображении. Проект, над которым я работаю, также требует, чтобы строка перемещалась по экрану как минимум 22 раза в секунду. Следовательно, его положение может быть где угодно на изображении. Таким образом, перерисовка изображения со строкой будет невозможна, так как я считаю, что есть лучшие способы сделать это, и это излишне потребляет ресурсы, перерисовывающие все изображение. Я также пытался использовать panel.getGraphics, а затем рисовать на изображении, но затем весь нарисованный текст появляется по всему экрану (код ниже). Мне было интересно, если кто-то может направить меня в правильном направлении, как я могу рисовать текст поверх окрашенного изображения, но он также должен сбросить свою позицию, когда это необходимо. Код, который я пробовал, который не сбрасывает свою предыдущую позицию ниже.

Оригинальная панель с изображением:

public class PanelForImages extends JPanel{

private BufferedImage image;

public PanelForImages(File image) throws IOException{
    //this.image = image;
    //URL resource = getClass().getResource("so2.jpg");
    this.image = ImageIO.read(image);

}

 @Override
 public void paintComponent(Graphics g){
    //super.paint(g);
    //super.paintComponents(g);
    super.paintComponent(g);
    //g.drawImage(image, 3, 4, this);
    g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
    g.drawString("HELLOOOOOOOOOOOOOOOOOOOOOOOO", 400, 400);
    //repaint();

 }
}

Метод, которым я пытаюсь нарисовать строку поверх изображения.

public void drawFixationsOnFrame(GazeData gazeData){

    Graphics g = this.panelForImages.getGraphics();


    g.drawString("TEsting 123", (int)gazeData.smoothedCoordinates.x, (int)gazeData.smoothedCoordinates.y);

    g.dispose();

    jF.revalidate();
}

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

1 ответ

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

Тогда не перерисовывайте все изображение. JComponent repaint(...) Метод имеет переопределение, позволяющее перерисовывать только выделенный прямоугольник (подробнее об этом см. в JComponent API). Вы захотите переместить изображение в Swing Timer, затем перекрасить его старое местоположение (чтобы избавиться от старого изображения String) и перекрасить его новое местоположение. Если вам нужны размеры строки, используйте FontMetrics, чтобы получить ограничительный прямоугольник.

Я отмечаю, что у вашего кода есть две другие проблемы, которые вызывают беспокойство, некоторые из них закомментированы:

  • призвание getGraphics() на компонент, чтобы получить его графический компонент и рисовать с ним - вы не хотите делать это, так как это приведет к недолговечному объекту Graphics с риском сломанных изображений или NPE
  • призвание repaint() изнутри paintComponent, Это плохой и совершенно неконтролируемый способ создания анимации. Вместо этого используйте таймер Swing, чтобы иметь полный контроль над анимацией и не использовать paintComponent для чего-то, для чего он не предназначен.
Другие вопросы по тегам