0

私が抱えている問題はImageIO、JAVAのアプレットビューアでクラスで参照している画像が表示されないことです。私はオンラインでチュートリアルをフォローしていましたが、著者からの返信はまだありません。彼のページにも同様の質問があり、彼は答えなかったので、彼は自分でそれを理解しようとしていると思います。

これが私がこれまでに持っているものです。

import java.applet.Applet;
import java.awt.Graphics;


public class SuperheroGame extends SuperHeroGameLoop{


/**
 * 
 */
private static final long serialVersionUID = 1L;

public void init () {
    setSize(320,240);
    Thread th = new Thread(this) ;
    th.start();
    offscreen = createImage(320,240);
    d = offscreen.getGraphics();
    addKeyListener(this);
}

public void paint (Graphics g) {
    d.clearRect(0, 0, 320, 240);
    d.drawImage(background, 0, 0, this);
    d.drawImage(w2, x,y, this);
    //d.drawImage(foreground, 0, 0, this);
    //g.drawImage(offscreen, 0, 0, this);

}

public void update(Graphics g) {
    paint(g);
}

}

以下は、コードにネストされた関数の大部分を含む私のTesterクラスです。

import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;


public class SuperHeroGameLoop extends Applet implements Runnable, KeyListener {

/**
 * 
 */
private static final long serialVersionUID = 1L;
public int x,y;
public Image offscreen;
public Graphics d;
public boolean up, down, left, right;
public BufferedImage background, foreground, w1, w2, w3, w4;

public void run() {

    x = 100;
    y = 100;
    try {
        //background = ImageIO.read(new File ("background.png"));
        //foreground = ImageIO.read(new File ("foreground.png"));
        w1 = ImageIO.read(new File("red copy.png"));
        w2 = ImageIO.read(new File("red copy.png"));
        w3 = ImageIO.read(new File("red copy.png"));
        w4 = ImageIO.read(new File("red copy.png"));
    } catch (IOException e1) {

        e1.printStackTrace();
    }
    while(true) {
    if (left == true) {
        x-=2;
    }
    if (right == true) {
        x+=2;
    }
    if (up == true) {
        y-=2;
    }
    if (down == true) {
        y+=2;
    }

    repaint();
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == 37) {
        left = true;
    }

    if (e.getKeyCode() == 39) {
        right = true;
    }

    if (e.getKeyCode() == 38) {
        up = true;
    }

    if (e.getKeyCode() == 40) {
        down = true;
    }
}
public void keyReleased(KeyEvent e) {
    if (e.getKeyCode() == 37) {
        left = false;
    }

    if (e.getKeyCode() == 39) {
        right = false;
    }

    if (e.getKeyCode() == 38) {
        up = false;
    }

    if (e.getKeyCode() == 40) {
        down = false;
    }
}
public void keyTyped(KeyEvent e) {

}

}

ヘルプやフィードバックをいただければ幸いです。

4

2 に答える 2

4

..私の画像ファイルは私のコンピュータ上にのみあり、URLやネット上の何かからリモートで読み取られることはありません。

アプレットがワールドワイドウェブ上のオーディエンスに展開されるとき、それはどのように機能するはずですか?

アプレットがサイトから私のPCにロードされると、PCから画像をロードするオプションはなくなります( PCがサーバーでない場合)。アプレットの画像は、URLではなくから取得Fileする必要があります。信頼できるアプレットを除いて、アプレットと同じサイトのURLから取得する必要があります。

ImageIO.read(..)ストリーム、ファイル、またはURLに対してオーバーロードされているため、イメージのロードに引き続き使用できます。

アプレットのURLを作成するには、少なくとも3つの方法があります。画像が次の場合:

  • 同じサーバー上の緩いリソース。ドキュメントベースまたはコードベースを基準にしたURLを作成します。
  • 属性で言及されているJar内archive(実行時のクラスパス上にあります)。使用する:
URL urlToImage = this.getClass().getResource("/path/to/image.png");

さらなるヒント。

  1. 完全には明確ではありませんSuperheroGameが、のインスタンスのようですApplet。このミレニアムはSwingを使用しているため、拡張する必要がありJAppletます。
  2. しかし、それから私たちは2番目の問題に行き着きます。そこでSuperheroGameは実際に拡張しますSuperHeroGameLoop(震え)。この時点で、またはのいずれを拡張するのではなく、またはでSuperHeroGameLoopコーディングする必要があることに気付きました。一般的な原則は、「それ自体をアプレット、フレーム、ダイアログ、ウィンドウ、レイアウトの制約、タブ、または内部フレームに追加できるコンテナでカスタムペイントを行うことです。」です。PanelJPanelApplet JApplet
  3. setSize(320,240); これはほとんどのGUIではお勧めできませんが、アプレットではお勧めできません。アプレットのサイズはHTMLで設定されており、そのサイズを尊重する必要があります。
  4. Thread th = new Thread(this) ; アニメーションを行うには、Swingを使用しTimerます。次のメッセージはSwing用に作成されましたが、AWT AFAIUにも同様に適用されます(結局のところ、EDT自体は、AWTによって開始、使用、および制御されるスレッドです)。
    EDT(イベントディスパッチスレッド)をブロックしないでください-それが発生すると、GUIは「フリーズ」します。呼び出す代わりに、タスクを繰り返すため、または長時間実行されるタスクのためThread.sleep(n)にSwingを実装します。詳細については、Swingでの同時実行を参照してください。TimerSwingWorker
  5. addKeyListener(this);
    1. より信頼性の高いフォーカスを得るには、GUIをフリーフローティングにします。これを行うには、ゲームをフレーム(JFrame)に入れ、JavaWebStartを使用してリンクから起動します。
    2. SwingベースのGUIについては、キーバインディングを参照してください。

これは5つ以上のヒントであり、の終わりに到達しましたinit。これは、そのコードにつながったものよりも、さまざまなソースからコードを書くことを学ぶ方が最適であることを示唆しています。

于 2013-01-01T02:46:31.980 に答える
3

ブラウザで実行するように設計され、セキュリティマネージャによって制約されているアプレットを使用しています。セキュリティマネージャは、ローカルディスクI/Oを実行できないようにする可能性があります。

TrashgodとPhilipは、このテーマに関する有用な記事を紹介しています。

しかし、別のタックを取ると...

Appletは、のコンテンツペインComponentに追加できるです。JFrame次のような操作を行うことで、アプレットをスタンドアロンアプリケーション(制限付きのセキュリティマネージャはありません)に変えることができます...

新しいクラスを追加します。

public class SwingApp
{
  public static void main(String[] args)
  {
    final JFrame frame = new JFrame("Swing App");

    SwingUtilities.invokeLater(new Runnable()
    {
      public void run()
      {
        final SuperHeroGameLoop loop = new SuperHeroGameLoop();

        frame.getContentPane().add(loop);
        frame.setSize(320, 240);

        loop.init();

        frame.setVisible(true);
      }
    });
  }
}

(ただし、コンパイラを介さずにメモリから入力しただけなので、コンパイルエラーが発生したことをお詫びします)...

これをコンパイルして、スタンドアロンアプリケーションとして実行します。

もう1つの方法は、アプレットJComponentアプローチを完全に廃止し、 s...を使用してデスクトップSwingアプリケーションとして作成することです。

于 2013-01-01T01:36:30.237 に答える