1

我在网页中嵌入了一个 Java JApplet。JApplet 窗口包含一个扩展 JPanel 的类的单个实例 - 与 JApplet 大小相同。当用户单击面板中的按钮时,小程序可以生成弹出窗口 (JFrame)。

每次我单击一个按钮以弹出一个窗口时,我的小程序都会在重新绘制时闪烁。当我再次单击它或当它具有焦点并单击另一个窗口时,它也会执行相同的操作 - 我的结论是:它是在 focusLost() 和 focusGained() 事件上强制执行的重绘。

我在面板的 paint() 方法中实现双缓冲,如下所示:

@Override
public void paint(Graphics g)
{
    if(resized)
    {
        offscreen = createImage(getWidth(),getHeight());
        resized = false;
    }

    Graphics offscreenG = offscreen.getGraphics();

    /// DRAW HERE:

    // paint the main window contents:
    view.paint(offscreenG);
    // paint the child components of our panel.
    super.paint(offscreenG);

    /// FRAW FINISHED

    g.drawImage(offscreen,0,0,this);
    offscreenG.dispose();
}

视图对象不是一个摆动组件,而只是一个知道将所有内容绘制到 Graphics 对象上的类。

JApplet 的paint() 方法未被覆盖。

我可能会覆盖我的 JApplet 的 focusGained/focusLost 方法以防止重新绘制 - 但我宁愿听到一个更好的问题解决方案。

4

1 回答 1

1

不需要实现双缓冲,这是由 Swing 自动完成的。您构建小程序的方式与构建应用程序的方式相同。也就是说,您将组件添加到 JApplet 的内容窗格中。

如果您必须进行自定义绘画,那么您将覆盖 JPanel 的 paintComponent() 方法并将面板添加到小程序。

阅读 Swing 教程中关于自定义绘画的部分以获取示例。

于 2010-03-03T20:38:29.130 回答