在Jframe图像上绘制

时间:2013-11-24 00:14:59

标签: java swing jframe jcomponent

我想读取一个文件来获取一些点,然后在图像上绘制这些点。目前,我能够在图像上绘制值,但文件被读取三次,矩形被绘制三次。我不知道问题出在哪里。下面是代码。 Read()函数可以单独运行,因此我没有在代码中包含它。

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 个答案:

答案 0 :(得分:3)

不要,不要,不要从任何绘画方法(例如paintComponent(...))中读取文件。 :)

  1. 那个方法应该只用于绘画。你放慢速度越慢,你的GUI响应就越少。
  2. 您无法控制调用该方法的次数,因为它不受您(程序员)的直接控制。
  3. 你甚至无法完全控制如果调用paintComponent方法,因为JVM可能会决定过多的重绘请求被堆积起来,并且它可能不会尊重所有这些请求。 / LI>

    相反

    • 在构造函数或类似内容中读取数据一次
    • 我会创建一个读取方法,将我的点存储在ArrayList<Point>中,然后在paintComponent方法内部,使用for循环遍历该ArrayList并绘制它们。
    • 如果在程序运行期间点没有改变,你甚至可以通过获取它的Graphics上下文并使用它来绘制图像上的点来直接将它们绘制到BufferedImage上,然后在你的程序中显示新的BufferedImage。 paintComponent方法。

    其他建议:

    • 您阅读图像的空挡块是一件危险的事情。它的编码相当于闭着眼睛驾驶摩托车。至少打印出一个堆栈跟踪。
    • 不需要WindowListener。而只需将JFrame的defaultCloseOperation设置为JFrame.EXIT_ON_CLOSE:f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);