0

これは私のコードです:

package com.dani.Game;

import java.awt.*;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.io.*;
import java.util.*;

public class Game extends JFrame {

BufferedImage normal;

public static void main(String[] args) {
    Game game = new Game();
}

public Game() {

    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    try {
    normal = ImageIO.read(new File("C:\\ImageOne.jpg"));
    } catch (IOException e) {
        e.printStackTrace();
    }

    ImagePanel graphics = new ImagePanel();

    this.add(graphics);
    this.setVisible(true);

}

public class ImagePanel extends JPanel {

   public void paintComponent(Graphics g) {

    super.paint(g);
    g.drawImage(normal,normal.getWidth(), normal.getHeight(), this);

  }
}       

更新しました:

これを試すと、次の例外が発生します。

Exception in thread 
     "AWT-EventQueue-0" java.lang.StackOverflowError
    at sun.awt.AppContext.get(Unknown Source)
    at javax.swing.RepaintManager.currentManager(Unknown Source)
    at javax.swing.RepaintManager.currentManager(Unknown Source)
    at javax.swing.RepaintManager.currentManager(Unknown Source)
    at javax.swing.JComponent.paint(Unknown Source)
    at com.course.swing.headPrac$Drawing.paintComponent(headPrac.java:99)
    at javax.swing.JComponent.paint(Unknown Source)

私は何を間違っていますか?

4

2 に答える 2

1

とにかく、これはペイントとペイントコンポーネント間の呼び出しループのために StackOverflow を引き起こします。as for startsuper.paint(g)に置き換えます。super.paintComponent(g)

とにかく私からの作業

パッケージcom.dani.Game;

import java.awt.BorderLayout;
java.awt.Graphics をインポートします。
import java.awt.image.BufferedImage;
java.io.File をインポートします。
import java.io.IOException;

javax.imageio.ImageIO をインポートします。
javax.swing.JFrame をインポートします。
javax.swing.JPanel をインポートします。

public class Game extends JFrame {

    BufferedImage ノーマル;

    public static void main(String[] args) {
        ゲーム game = new Game();
    }

    公開ゲーム() {
        this.setLayout(新しい BorderLayout());
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        試す {
            normal = ImageIO.read(new File("d:\\providers.gif"));
        } キャッチ (IOException e) {
            e.printStackTrace();
        }

        ImagePanel グラフィックス = new ImagePanel();

        this.add(グラフィックス、BorderLayout.CENTER);
        this.setVisible(真);

    }

    public class ImagePanel extends JPanel {

        public void paintComponent(Graphics g) {

            super.paintComponent(g);
            g.drawImage(normal, 0, 0, normal.getWidth(), normal.getHeight(), this);

        }
    }
}
于 2013-08-08T13:44:33.523 に答える
1

正しく動作するように、コードにいくつかの変更を加えました。

  • メイン メソッドで SwingUtilities の invokeLater メソッドを呼び出して、イベント ディスパッチ スレッド (EDT) で Swing GUI が開始されるようにしました。Swing GUI のコンポーネントは、EDT で定義して使用する必要があります。

  • JFrame を拡張する代わりに JFrame を使用しました。メソッドの 1 つを変更する場合にのみ、Swing コンポーネントを拡張します。それ以外の場合は、Swing コンポーネントを使用します。

  • 画像ファイル名にスラッシュを使用しました。Java は、スラッシュを Windows のバック スラッシュに変換します。

  • JFrame pack メソッドへの呼び出しを追加して、JFrame 自体が画像サイズに合わせられるようにしました。

  • JPanel が画像のサイズになるように、ImagePanel コンストラクターに setPreferredSize メソッドの呼び出しを追加しました。

  • paintComponent メソッドの super 呼び出しを super.paintComponent(g) に修正しました。

  • サイズではなく画像の原点を使用するように drawImage メソッドを修正しました。

これがコードです。

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Game implements Runnable {

    BufferedImage   normal;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Game());
    }

    @Override
    public void run() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        try {
            normal = ImageIO.read(new File("C:/ImageOne.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }

        ImagePanel graphics = new ImagePanel();

        frame.add(graphics);
        frame.pack();
        frame.setVisible(true);
    }

    public class ImagePanel extends JPanel {

        public ImagePanel() {
            setPreferredSize(new Dimension(normal.getWidth(),
                    normal.getHeight()));
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(normal, 0, 0, this);
        }
    }

}
于 2013-08-08T15:32:39.303 に答える