Рисование строк поверх 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 для чего-то, для чего он не предназначен.