2013-11-24 1 views
1

Я хочу прочитать файл, чтобы получить некоторые очки, а затем нарисовать эти точки на изображении. В настоящее время я могу нарисовать значения на изображении, но файл читается три раза, а прямоугольники рисуются три раза. Я не знаю, где проблема. Ниже приведен код. Функция Read() работает отлично, поэтому я не включил ее в код.Нарисовать на Jframe image

P.S: Я новичок в JAVA и мало знаю о JFrame и Jcomponent.

 public class LoadImageApp extends JComponent { 

    BufferedImage img; 

    protected void paintComponent(Graphics g) { 

     super.paintComponent(g); 
     g.drawImage(img, 0, 0, null); 

     Read(g);// This is the function in which I read a file. 
    } 

public LoadImageApp() { 
     try { 
      img = ImageIO.read(this.getClass().getResource("/New York.jpg")); 
     } catch (IOException e) { 
     } 

    } 

    public Dimension getPreferredSize() { 
     if (img == null) { 
      return new Dimension(100,100); 
     } else { 
      return new Dimension(img.getWidth(null), img.getHeight(null)); 
     } 
    } 



public static void main(String[] args) { 


     JFrame f = new JFrame("Load Image Sample"); 

     f.addWindowListener(new WindowAdapter(){ 
       public void windowClosing(WindowEvent e) { 
        System.exit(0); 
       } 
      }); 
     LoadImageApp img = new LoadImageApp(); 
     f.add(img); 
     f.pack(); 
     f.setVisible(true); 


    } 
} 
+1

1) Используйте последовательный и логический отступ для кодовых блоков. Отступ кода предназначен для того, чтобы помочь людям понять поток программы. 2) Чтобы получить более эффективную помощь, опубликуйте [SSCCE] (http://sscce.org/). –

ответ

3

Не, не, НЕ чтение из файла из любого метода живописи, таких как paintComponent(...). :)

  1. Этот метод предназначен только для окраски. Чем больше вы его замедляете, тем менее отзывчивым будет ваш графический интерфейс.
  2. Вы не можете контролировать, сколько раз метод вызывается, поскольку он не находится под прямым контролем вас, программист.
  3. Вы не можете даже полностью управлять , если вызывается метод paintComponent, поскольку JVM может решить, что слишком много запросов на перерисовывание сложены, и это может не похвастать все из них.

Вместо

  • чтения в данных раз в конструкторе или что-то подобное.
  • Я бы создал метод чтения, который хранит мои точки в ArrayList<Point>, а затем внутри метода paintComponent, итерации через этот ArrayList с использованием цикла for и их рисования.
  • Если очки не изменяются во время прогона вашей программы, вы можете даже нарисовать их непосредственно в BufferedImage, получив контекст своей графики и используя это, чтобы нарисовать точки на изображении, а затем покажите новый BufferedImage в своем paintComponent метод.

Другие предложения:

  • Это пустой поймать блок, где вы читаете изображение является опасным, что нужно сделать. Это кодирующий эквивалент вождения мотоцикла с закрытыми глазами. По крайней мере, распечатайте стек.
  • WindowListener не требуется. Вместо этого просто установите JFrame по умолчаниюCloseOperation в JFrame.EXIT_ON_CLOSE: f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 Смежные вопросы

  • Нет связанных вопросов^_^