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类都没有显示在 Applet 上。我猜这现在归结为定位?有任何想法吗?

EDIT: Gone back to the previously asked question Hovercraft, and found it was due to the layout of the contentPane and the order at with the components were added.

4

2 回答 2

5

一些建议:

  • 不要在 JApplet 的paint 方法中绘制,因为它是一个顶级窗口,不应该直接在上面绘制。而是在paintComponent(Graphics g)JPanel 或其他 JComponent 的方法中绘制,然后将该 JPanel 添加到 JApplet 的 contentPane。
  • 与他关于超级调用的建议类似,您在此方法中的第一个方法调用应该是super.paintComponent(g);刷新 JPanel 图形的方法。
  • 闪烁来自您在 JApplet 的绘制方法中直接绘制的图形。如果您按照我的建议进行操作,您将利用 Swing 对双缓冲的使用。
  • 由于这是一个 Swing 应用程序,您应该避免使用 KeyListeners,而是使用 Key Bindings。
  • 不要通过调用 getGraphics() 来获取组件的 Graphics 对象。获得的 Graphics 对象将是短暂的,因此不会在任何重绘后持续存在。

您在上面发布的代码让我有些困惑。你想用它做什么?您已经向 JApplet 添加了组件,这些组件应该处理它们自己的图形,然后您也在 JApplet 上进行绘画。你到底想达到什么样的行为?

于 2012-06-10T02:32:34.410 回答
1

在您的paint方法中,请确保调用,super.paint(g)因为它是继承自 的方法Container,是 的超类JApplet

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