-2

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

我在这里收到以下错误。

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

    }
}

任何帮助都会很棒:)

4

4 回答 4

5

几点。

  1. 解决属性范围的问题。image属性应交给(或加载到)构造函数并存储为对paint方法可见的类属性。切勿尝试在此方法中加载图像(或执行其他可能长时间运行的任务)。
  2. BG 的图像在部署时通常是嵌入式资源,因此通过 URL 访问它。
  3. AJComponent是一个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);
    }
}
于 2012-10-15T10:18:11.477 回答
3

您只需在 try 块中声明您的图像变量......它在它之外是不可见的。

于 2012-10-15T10:09:04.037 回答
2
try{
    Image image = ImageIO.read(new File(filename));
}catch(IOException ex){
    // Handle Exeption
}

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

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

在 -block 之外声明变量try

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方法中加载图像时,每次需要绘制组件时都会加载它。这将使您的应用程序变慢。

于 2012-10-15T10:10:16.103 回答
1

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

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

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

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

于 2012-10-15T10:10:39.690 回答