3

私はこの学校の課題で大きな問題を抱えています。幸運なことに、私はそれを一度早く始めました。を使って子供向けの算数ゲームを作るように依頼されましたJApplet。ここまでは順調ですね。を作成しJPanel、それを に追加して、JAppletすべての図面を保持します (JPanelコンテンツは継続的に再描画されます)。JLabelただし、コンテンツ ペインになどの Swing コンポーネントを追加しようとすると、JApplet表示されないか、存在する兆候が表示されません。私はJApplets にまったく慣れていないので、明らかな場合はあまり厳しくしないでください。

以下はコードです:

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JApplet;
import javax.swing.JPanel;
import javax.swing.Timer;

public class CountingSheep extends JApplet
{

    final int BOARDWIDTH = 800;
    final int BOARDHEIGHT = 500;
    final int SCREENWIDTH = 800;
    final int SCREENHEIGHT = 800;
    Dimension boardDim = new Dimension(BOARDWIDTH, BOARDHEIGHT);
    Dimension screenDim = new Dimension(SCREENWIDTH, SCREENHEIGHT);
    Graphics bufferGraphics;
    Image offScreen;
    Image backgroundImage;
    Image[] sheepImage = new Image[2];
    JPanel gameBoard = new JPanel(true);
    List<Sheep> sheepArray = new ArrayList<>();
    Timer myTimer;

    public void init()
    {
        loadImages();
        initScreen();
        initBufferGraphics();
        initBoard();
        initTimer();
        sheepArray.add(new Sheep(sheepImage));
        myTimer.start();
    }

    private void loadImages()
    {
        sheepImage[0] = getImage(getDocumentBase(), "sheep.png");
        sheepImage[1] = getImage(getDocumentBase(), "sheep2.png");
        backgroundImage = getImage(getDocumentBase(), "bg.jpg");
    }

    private void initScreen()
    {
        setSize(800, 600);
        setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
    }

    private void initBoard()
    {
        gameBoard.setPreferredSize(new Dimension(BOARDWIDTH, BOARDHEIGHT));
        getContentPane().add(gameBoard);
    }

    private void initBufferGraphics()
    {
        offScreen = createImage(BOARDWIDTH, BOARDHEIGHT);
        bufferGraphics = offScreen.getGraphics();
    }

    private void initTimer()
    {
        myTimer = new Timer(80, new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                timerTick(e);
            }
        });
    }

    private void timerTick(ActionEvent e)
    {
        repaint();
    }

    public void paint(Graphics g)
    {
        bufferGraphics.clearRect(0, 0, BOARDWIDTH, BOARDHEIGHT);
        bufferGraphics.drawImage(backgroundImage, 0, 0, null);
        drawSheepHerd();
        moveSheepHerd();
        gameBoard.getGraphics().drawImage(offScreen, 0, 0, this);
    }

    public void drawSheepHerd()
    {
        for (Sheep s : sheepArray)
        {
            s.draw(bufferGraphics);
        }
    }

    public void moveSheepHerd()
    {
        for (Sheep s : sheepArray)
        {
            s.move();
        }
    }
}

前もってありがとう、私は困惑しているので、皆さんがそれを理解できることを願っています.

4

1 に答える 1

3

私の推奨事項のいくつかを要約すると:

  • paintComponent(...)JPanel を拡張し、オーバーライドして背景画像を描画し、アニメーションを表示する独自の ContentPane クラスを作成します。
  • JApplet の init メソッドで setContentPane(...) を呼び出し、このクラスのオブジェクトを渡します。
  • ContentPane のさまざまなレイアウトと配置を試してください。
  • paintComponent(Graphics g)メソッドの最初の行が次のsuper.paintComponent(g)ようになっていることを確認してください: ペイントするたびに描画がリセットされるようにします。
  • JPanels はデフォルトで不透明です。contentPanes は不透明でなければならないため、そのままにしておく必要があります。contentPane の上にコンポーネントを追加し、追加されたコンポーネントの背後にある画像を表示したい場合は、それらを非不透明にする必要がある場合があります。
于 2012-06-09T12:34:44.717 に答える