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

每次我单击一个按钮弹出一个窗口时,小程序在重新绘制时都会闪烁。当我再次单击它或获得焦点并单击另一个窗口时,它也执行相同的操作-我的结论是:这是强制对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();
}


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

JApplet的paint()方法不会被覆盖。

我可能可以重写JApplet的focusGained / focusLost方法以防止重新绘制-但我希望听到一个更好的解决方案。

最佳答案

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

如果必须进行自定义绘制,则可以重写JPanel的paintComponent()方法,并将面板添加到小程序中。

阅读有关Custom Painting的Swing教程中的部分,以获得示例。

关于java - Java Applet在focusLost和focus上闪烁,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2374403/

10-11 18:11