JApplet意外地表现出来

时间:2012-06-10 00:28:45

标签: java swing awt japplet

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上显示。我猜这现在归结为定位?有什么想法吗?

编辑:回到之前提到的问题Hovercraft,发现它是由于contentPane的布局,并且添加了组件的顺序。

2 个答案:

答案 0 :(得分:5)

一些建议:

  • 不要在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上绘制。你想要达到什么样的行为?

答案 1 :(得分:1)

paint方法中,请务必致电super.paint(g),因为这是一个继承自Container的超级类JApplet的方法。

@Override
public void paint(Graphics g)
{
    super.paint(g);
    ...
}