2017-01-10 19 views
0

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

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

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(); 
} 

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

+0

Возможный дубликат [Использование Graphics2D для наложения текста на BufferedImage и вернуть BufferedImage] (http://stackoverflow.com/questions/2658554/using-graphics2d-to-overlay-text-on-a-bufferedimage -and-return-a-bufferedimage) –

+0

@CatalinaIsland Как? Их текст рисунка над изображением в той же панели. Я не хочу этого делать, потому что тогда я буду рисовать изображение не менее 22 раз в секунду. Я просто хочу иметь возможность печатать изображение ОДНИМ, а затем продолжать менять положение теста, вместо того, чтобы рисовать все изображение. Я немного любитель, поэтому я уверен, что для меня должен быть способ перерисовать ТОЛЬКО текст при необходимости, а не весь образ. Надеюсь, это имеет смысл. – paddy

+1

Может быть, они показывают [здесь] (http://stackoverflow.com/a/3256941/261156)? –

ответ

1

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

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

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

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