Java小程序在focusLost和FocusGovered上闪烁

Java小程序在focusLost和FocusGovered上闪烁,java,swing,applet,focus,flicker,Java,Swing,Applet,Focus,Flicker,我在网页中嵌入了一个Java JApplet。 JApplet窗口包含扩展JPanel的类的一个实例-大小与JApplet相同。 当用户单击面板中的按钮时,小程序可以生成弹出窗口(JFrames) 每次我点击一个按钮弹出一个窗口,我的小程序在重新绘制时就会闪烁。当我再次点击它或者当它有焦点时,我点击另一个窗口时,它也会做同样的事情——我的结论是:这是一个在focusLost()和FocusGovered()事件上强制进行的重新绘制 我正在面板的paint()方法中实现双缓冲,如下所示: @Ove

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

每次我点击一个按钮弹出一个窗口,我的小程序在重新绘制时就会闪烁。当我再次点击它或者当它有焦点时,我点击另一个窗口时,它也会做同样的事情——我的结论是:这是一个在focusLost()和FocusGovered()事件上强制进行的重新绘制

我正在面板的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();
}
view对象不是swing组件,而是一个知道如何将所有内容绘制到图形对象上的类

JApplet的paint()方法未被重写


我可能会覆盖JApplet的FocusGain/focusLost方法以防止重新绘制-但我更愿意听到更好的解决方案。

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

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


阅读Swing教程中关于示例的部分。

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

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

阅读上Swing教程中的部分以获取示例