【问题标题】:JApplet behaving unexpectedlyJApplet 行为异常
【发布时间】:2012-06-10 00:28:45
【问题描述】:
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 的布局和添加了组件的顺序。

【问题讨论】:

标签: java swing awt japplet


【解决方案1】:

一些建议:

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

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

【讨论】:

  • @JohnW:同样,您需要摆脱您的paint方法,同样,您不应该尝试直接在任何组件上调用paint(),除非在特殊情况下(例如有时在打印时)。最后,正如我认为我们之前讨论过的,您必须阅读 Swing 图形教程,因为您的代码离题太远了。我无法提供任何更具体的帮助,因为您发布的代码不是sscce。详情请阅读链接。
  • 编辑:事实上,我之前已经警告过你不要直接在 JApplet 上绘图,但你似乎忽略了这个和我的其他建议,这就引出了一个问题——为什么?跨度>
  • 祝贺您成为 AABHC(Applet Answer Badge Holder's Club)的会员!这是一个非常新的俱乐部,因为在我们两个人之前它不是一个“俱乐部”。顺便说一句 - “长期建立”的传统规定新成员在我们的月度会议上购买第一轮。周五晚上在“红狮”见。 ;)
  • @Andrew:谢谢,谢谢。我很乐意购买第一轮。我建议首要任务应该是选举官员。我提名自己为首席战略家和打击部队指挥官。你可以成为俱乐部的吉祥物。
  • “你可以成为俱乐部的吉祥物。” 我可以穿有趣的动物服装吗?如果是这样,这是一个完成的交易。 :)
【解决方案2】:

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

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

【讨论】:

  • @JohnW 你有两个选择,要么缓冲图像(除非你更新大部分屏幕,否则性能损失),或者只重绘屏幕的必要部分(参见@ 987654323@).
  • @JohnW 由于您的各个组件是自己绘制的,因此无需覆盖paint。删除 CountingSheep 类中的 paint 方法可能会解决一些问题。
猜你喜欢
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
  • 2013-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
相关资源
最近更新 更多