3

私は私のような同様の質問で他のトピックを調べようとしましたが、それらの解決策のほとんどは画像のクラスパスを修正することを指しているようです...そこで、クラスパスを絶対に変更し、クラス取得リソースを使用してそれらを試しましたが、それでも画像はレンダリングされません。私はそれが主な方法に関係しているのではないかと疑っています。オンラインのどこかにソースコードをコピーしたので、その方法がどのように機能するのか完全には理解していません。私はEclipseエディターを使用しており、すでにFlapクラスファイルと一緒に画像ファイルを配置していました。

package wing;

import java.awt.*;
import javax.swing.*;

public class Flap extends JComponent implements Runnable {
Image[] images = new Image[2];
int frame = 0;

public void paint(Graphics g) {
    Image image = images[frame];
    if (image != null) {
        // Draw the current image
        int x = 0;
        int y = 0;
        g.drawImage(image, x, y, this);
    }
}

public void run() {
    // Load the array of images
    images[0] = new ImageIcon(this.getClass().getResource("/Wing/src/wing/wing1.png"));
    images[1] = new ImageIcon(this.getClass().getResource("/Wing/src/wing/wing2.png"));

    // Display each image for 1 second
    int delay = 10000;    // 1 second

    try {
        while (true) {
            // Move to the next image
            frame = (frame+1)%images.length;

            // Causes the paint() method to be called
            repaint();

            // Wait
            Thread.sleep(delay);
        }
    } catch (Exception e) {
    }
}

public static void main(String[] args) {
    Flap app = new Flap();

    // Display the animation in a frame
    JFrame frame = new JFrame();
    frame.getContentPane().add(app);
    frame.setSize(800, 700);
    frame.setVisible(true);

    (new Thread(app)).start();
}

}
4

3 に答える 3

2
  • JComponent(s)他に追加されていない場合public class Flap extends JComponent implements Runnable {

    1. 画像をアイコンとしてJLabelに配置する

    2. 代わりにSwing Timerを使用しますRunnable#Thread(Java とスレッドに関する基本的な知識も必要です) 。

  • に別のものがJComponent(s)追加されている場合public class Flap extends JComponent implements Runnable {

    1. Swing にはpaint()使用しないでくださいpaintComponent()JComponents

    2. 代わりにSwing Timerを使用しますRunnable#Thread(Java とスレッドに関する基本的な知識も必要です) 。

  • どちらの場合も、画像をローカル変数としてロードし、画像を永久にリロードしないでください

  • どちらの場合も、InitialThreadから Swing GUI を呼び出しています。

于 2012-06-19T15:32:21.527 に答える
2

リソース名"/Wing/src/wing/wing1.png"は疑わしいように見えます。これは、リソースが実際に存在する場所ではない可能性が高い「/Wing/src/wing/」ディレクトリにリソースを配置することを意味します。試してみてください"/wing/wing1.png"(他の人も同様です)

その理由は、srcフォルダーにソースが含まれており、それがクラスに変換されるためです。したがって、「src/wing/Flap.java」にはクラスパス「/wing/Flap.class」が含まれます。リソースについても同様です (パッケージ化の方法によって異なります)。

また、リソースが実際にあるべき場所 (出力ディレクトリの Flap.class ファイルの隣など) にあることを確認してください。そうしないと、クラス ローダーがリソースを見つけられません。

于 2012-06-19T15:33:59.780 に答える
2

ImageIcon は Image ではありません:

images[0] = new ImageIcon(this.getClass().getResource("/Wing/src/wing/wing1.png")).getImage();

main でアプリケーションが終了することはありません:

frame.addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent e) {
        System.exit(0);
    }
});
于 2012-06-19T15:55:45.973 に答える