-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コンストラクターに渡され (またはコンストラクターに読み込まれ)、ペイント メソッドから見えるクラス属性として格納される必要があります。この方法で画像をロードしようとしないでください (または他の潜在的に長時間実行されるタスクを実行しないでください)。
  2. BG 用の画像は通常、デプロイ時に埋め込みリソースになるため、URL でアクセスします。
  3. AJComponentImageObserverそう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が間違っています。-block内で変数を宣言していることに注意してくださいtry{ ... }変数は-blockの外には存在しませんtry

-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 に答える