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上。我猜这已经到定位了吗?有任何想法吗?

编辑:回到以前的问题气垫船,并发现这是由于contentPane的布局和组件的添加顺序。

最佳答案

一些建议:


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


您上面发布的代码让我有些困惑。您打算如何处理?您已经向JApplet添加了组件,这些组件应该处理它们自己的图形,然后还要在JApplet上绘画。您到底想实现哪种行为?

10-07 13:41