1

画像をウィンドウに印刷しようとしています。すべてがエラーなしで実行され、drawImageを別のグラフィッククラスに置き換えても機能します。ただし、ウィンドウに画像が表示されないため、理由がわかりません。繰り返しになりますが、JFrameとグラフィックスは他のグラフィックスの描画で正常に機能しますが、ここでは画像を描画しません。ありがとう。

import javax.swing.JApplet;
import javax.swing.JFrame;
import javax.imageio.*;
import javax.imageio.stream.*;
import java.awt.*;
import java.awt.image.*;
import java.io.*;

public class GraphicsMovement2 extends JApplet{
    BufferedImage image = null;

    public static void main(String args[]){
        BufferedImage image = null;
        try {
            File file = new File("C:\\Users/Jonheel/Google Drive/School/10th Grade/AP Computer Science/Junkbin/MegaLogo.png");
            ImageInputStream imgInpt = new FileImageInputStream(file);
            image = ImageIO.read(file);
        }
        catch(FileNotFoundException e) {
            System.out.println("x");
        }
        catch(IOException e) {
            System.out.println("y");
        }


        JApplet example = new GraphicsMovement2();
        JFrame frame = new JFrame("Movement");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(example);
        frame.setSize(new Dimension(1366,768));       //Sets the dimensions of panel to appear when run
        frame.setVisible(true);
    }
    public void paint (Graphics page){
    page.drawImage(image, 100, 100, 100, 100, Color.RED, this);
  }
}
4

3 に答える 3

7

2回定義imageしました...

BufferedImage image = null;

public static void main(String args[]){
    BufferedImage image = null;

これは本質的に、paintメソッドに到達するまでにnull、インスタンス変数を初期化していないことを意味します。

もう 1 つの問題は、静的参照から画像を読み込もうとしているが、imageとして宣言されていないという事実ですstatic。このロジックをコンストラクターまたはインスタンス メソッドに移動することをお勧めします。

JAppletに追加するときはコンテナとして使用しないでください。JFrameのようなものを使用する方が適切ですJPanel。コンテナに物を追加するときに役立ちます。

YOU MUST CALL super.paint(g) ...実際には、やのような最上位コンテナのメソッドをオーバーライドしないでください。のようなものを使用して、代わりにメソッドをオーバーライドしてください。最上位のコンテナはダブル バッファリングされません。paintJFrameJAppletJPanelpaintComponent

メソッドは多くのpaint重要な作業を行い、使いやすくなっていますJComponent#paintComponent...しかし、呼び出すことを忘れないでくださいsuper.paintComponent

更新しました

image使用するコンテキスト内で定義する必要があります。

imageを のインスタンス フィールドとして宣言したため、参照するGraphicsMovement2には のインスタンスが必要にGraphicsMovement2なります。

ただし、mainメソッドである ではstatic、 という名前の変数も宣言していますimage

paintメソッドはGraphicsMovement2、で宣言した変数を見ることができずmain、インスタンス フィールド (これは ですnull) だけを見ることができます。

この問題を解決するには、イメージのロードを のインスタンスのコンテキストに移動する必要がありますGraphicsMovement2。これは (コンテキスト内で) 最善の方法ですが、イメージのロードを のコンストラクタに移動する必要があります。GraphicsMovement2

public GraphicsMovement2() {
    try {
        File file = new File("C:\\Users/Jonheel/Google Drive/School/10th Grade/AP Computer Science/Junkbin/MegaLogo.png");
        ImageInputStream imgInpt = new FileImageInputStream(file);
        image = ImageIO.read(file);
    }
    catch(FileNotFoundException e) {
        System.out.println("x");
    }
    catch(IOException e) {
        System.out.println("y");
    }
}

以下の 2 つの例では、同じ結果が生成されます...

ここに画像の説明を入力

簡単な方法

public class TestPaintImage {

    public static void main(String[] args) {
        new TestPaintImage();
    }

    public TestPaintImage() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new ImagePane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class ImagePane extends JPanel {

        public ImagePane() {
            setLayout(new BorderLayout());
            ImageIcon icon = null;
            try {
                icon = new ImageIcon(ImageIO.read(new File("/path/to/your/image")));
            } catch (Exception e) {
                e.printStackTrace();
            }
            add(new JLabel(icon));
        }

    }
}

ハードウェイ

public class TestPaintImage {

    public static void main(String[] args) {
        new TestPaintImage();
    }

    public TestPaintImage() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new ImagePane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class ImagePane extends JPanel {

        private BufferedImage background;

        public ImagePane() {
            try {
                background = ImageIO.read(new File("/path/to/your/image"));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return background == null ? super.getPreferredSize() : new Dimension(background.getWidth(), background.getHeight());
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (background != null) {
                int x = (getWidth() - background.getWidth()) / 2;
                int y = (getHeight() - background.getHeight()) / 2;
                g.drawImage(background, x, y, this);
            }
        }
    }
}

時間をかけてチュートリアルを読む

于 2012-11-02T02:35:37.317 に答える
2

アプレットを使用していないときでも、クラスでJAppletを拡張しないでください。これは意味がありません。その代わり

  • 描画クラスにJPanelを拡張してもらいます
  • JPanelのpaintComponentメソッドで描画します
  • このJPanelをJFrameのcontentPaneに追加します。
  • Swingペインティングのチュートリアルをお読みください。あなたはこのようなものを推測してそれが機能することを期待することはできません、そしてチュートリアルはそれがどのように正しく行われるかをあなたに示します。
于 2012-11-02T02:24:39.037 に答える
2

ファイルデバイダを混在させないでください。

File file = new File("C:\\Users/Jonheel/Google Drive/School/10th Grade/AP Computer Science/Junkbin/MegaLogo.png");

次のものに置き換える必要があります。

File file = new File("C:/Users/Jonheel/Google Drive/School/10th Grade/AP Computer Science/Junkbin/MegaLogo.png");

于 2012-11-02T02:31:30.990 に答える