【问题标题】:Java graphics programming draw image errorJava图形编程绘制图像错误
【发布时间】:2012-10-05 07:07:09
【问题描述】:

您好,在我的框架上绘制图像时出错。我不确定这里出了什么问题。

我在这里收到以下错误。

Java: 77: cannot find symbol
symbol: variable image
location: class DrawComponent
g.drawImage(image, 0, 0, null);


class DrawComponent extends JComponent {
    public void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        // draw a circle with the same center
        double centerX = 250;
        double centerY = 180;
        double radius = 20;

        Ellipse2D circle = new Ellipse2D.Double();
        circle.setFrameFromCenter(centerX, centerY, centerX + radius, centerY + radius);
        g2.setPaint(Color.RED);
        g2.fill(circle);
        g2.draw(circle);

        String filename = "SydneyOperaHouse.jpeg";
        try{
            Image image = ImageIO.read(new File(filename));
        }catch(IOException ex){
            // Handle Exeption
        }

        g.drawImage(image, 0, 0, null);

    }
}

任何帮助都会很棒:)

【问题讨论】:

    标签: java swing user-interface compiler-errors scope


    【解决方案1】:

    几点。

    1. 解决属性范围的问题。 应将image 属性交给(或加载到)构造函数,并存储为对paint 方法可见的类属性。 切勿尝试在此方法中加载图像(或执行其他可能长时间运行的任务)。
    2. BG 的图像在部署时通常是嵌入式资源,因此通过 URL 访问它。
    3. JComponent 是ImageObserver 所以g.drawImage(image, 0, 0, null); 应该是
      g.drawImage(image, 0, 0, this);
    4. 我怀疑 0x0 处的图像绘制应该先于(在此之前完成)绘制红色椭圆,否则它会覆盖它的顶部。

    这是一个基于悉尼图像的示例(不,不是该死的歌剧院 - 挑剔,挑剔..)。

    import java.awt.*;
    import java.awt.geom.Ellipse2D;
    import javax.swing.*;
    import javax.imageio.ImageIO;
    import java.net.URL;
    
    public class DrawComponent extends JComponent {
    
        private Image image;
    
        DrawComponent(Image image) {
            this.image = image;
            Dimension d = new Dimension(image.getWidth(this),image.getHeight(this));
            this.setPreferredSize(d);
        }
        public void paintComponent(Graphics g) {
            // always call super first, to get borders etc.
            super.paintComponent(g);
    
            Graphics2D g2 = (Graphics2D) g;
    
            // paint the BG
            g.drawImage(image, 0, 0, this);
    
            // draw a circle with the same center
            double centerX = 250;
            double centerY = 180;
            double radius = 20;
    
            Ellipse2D circle = new Ellipse2D.Double();
            circle.setFrameFromCenter(centerX, centerY, centerX + radius, centerY + radius);
            g2.setPaint(Color.RED);
            g2.fill(circle);
            g2.draw(circle);
        }
    
        public static void main(String[] args) throws Exception {
            String s = "http://pscode.org/media/citymorn1.jpg";
            final Image image = ImageIO.read(new URL(s));
            Runnable r = new Runnable() {
                @Override
                public void run() {
                    JComponent gui = new DrawComponent(image);
                    JOptionPane.showMessageDialog(null, gui);
                }
            };
            SwingUtilities.invokeLater(r);
        }
    }
    

    【讨论】:

    • +1 表示所有点。也许你应该补充一点,解决第 1 点也解决了他的范围问题
    【解决方案2】:

    如果出现异常,您会在这里期待什么?

        String filename = "SydneyOperaHouse.jpeg";
        try{
            Image image = ImageIO.read(new File(filename));
        }catch(IOException ex){
            // Handle Exeption
        }
    
        g.drawImage(image, 0, 0, null);
    

    您应该在try{} 块内声明/初始化和绘图。

    【讨论】:

      【解决方案3】:
      try{
          Image image = ImageIO.read(new File(filename));
      }catch(IOException ex){
          // Handle Exeption
      }
      
      g.drawImage(image, 0, 0, null);
      

      变量image 的scope 错误。请注意,您是在 try-block 中声明变量。该变量不存在于try-block 的{ ... } 之外。

      在try-block 之外声明变量:

      Image image = null;
      try {
          image = ImageIO.read(new File(filename));
      } catch(IOException ex) {
          // Handle Exeption
      }
      
      if (image != null) {
          g.drawImage(image, 0, 0, null);
      }
      

      顺便说一句,您不应该在 paintComponent 方法中执行 I/O。最好将图像加载到其他地方(例如,当应用程序启动时),将其存储在成员变量中,然后在 paintComponent 方法中使用它。

      当您在paintComponent 方法中加载图像时,它会在每次需要绘制组件时加载它。这会使您的应用程序变慢。

      【讨论】:

        【解决方案4】:

        你只需在 try 块中声明你的 image 变量...它在外面是不可见的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-07-28
          • 2010-11-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-13
          • 1970-01-01
          相关资源
          最近更新 更多