2
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JApplet;
import javax.swing.Timer;

public class CountingSheep extends JApplet
{

    private Image sheepImage;
    private Image backgroundImage;
    private GameBoard gameBoard;
    private scoreBoard scoreBoard;

    public void init()
    {
        loadImages();
        gameBoard = new GameBoard(sheepImage, backgroundImage);
        scoreBoard = new scoreBoard();
        getContentPane().add(gameBoard);
        getContentPane().add(scoreBoard);
    }

    public void loadImages()
    {
        sheepImage = getImage(getDocumentBase(), "sheep.png");
        backgroundImage = getImage(getDocumentBase(), "bg.jpg");
    }
}

GameBoardクラスを追加するだけでプログラムは正しく動作しますが、クラスをJApplet追加しようとするとScoreBoard、両方のPanelクラスがアプレットに表示されません。これは今やポジショニングにかかっていると思いますか?何か案は?

編集:以前に尋ねられた質問Hovercraftに戻り、それがcontentPaneのレイアウトによるものであり、コンポーネントの順序が追加されたことがわかりました。

4

2 に答える 2

5

いくつかの提案:

  • JAppletのpaintメソッドはトップレベルのウィンドウであり、直接描画しないでください。描画しないでください。代わりpaintComponent(Graphics g)に、JPanelまたは他のJComponentのメソッドを描画し、そのJPanelをJAppletのcontentPaneに追加します。
  • スーパーコールに関する彼のアドバイスと同様に、このメソッドでの最初のメソッド呼び出しはsuper.paintComponent(g);、JPanelのグラフィックを更新するものである必要があります。
  • ちらつきは、JAppletのペイント方法で直接描画したものです。私が提案するように行う場合は、Swingのダブルバッファリングの使用を利用できます。
  • これはSwingアプリケーションであるため、KeyListenersの使用を避け、代わりにKeyBindingsを使用する必要があります。
  • `getGraphics()を呼び出してコンポーネントのGraphicsオブジェクトを取得しないでください。取得されたGraphicsオブジェクトは短命であるため、再描画後も保持されません。

あなたが上に投稿したコードは私には少し混乱しています。あなたはそれで何をしようとしていますか?JAppletにコンポーネントを追加しました。これらのコンポーネントは独自のグラフィックスを処理する必要があります。次に、JAppletにもペイントします。正確にどのような行動をとろうとしていますか?

于 2012-06-10T02:32:34.410 に答える
1

メソッドでは、のスーパークラスである、から継承されたメソッドであるpaintため、必ず呼び出すようにしてください。super.paint(g)ContainerJApplet

@Override
public void paint(Graphics g)
{
    super.paint(g);
    ...
}
于 2012-06-10T01:19:10.087 に答える