在一个简短的方法中,我使用 setVisible(false) 隐藏 JFrame。
然后我截取屏幕截图并使用 setVisible(true) 恢复 JFrame。
再次可见后,窗口应该显示与之前不同的图片(假设截取的屏幕截图的一部分)。
问题是,在调用 setVisible(true) 后,在调用 PaintComponent 并绘制更新的状态之前,窗口会在瞬间闪烁旧内容。
我可能可以用一种丑陋的方式解决这个问题,但我想知道是否有更好的解决方案。
预先感谢您的任何帮助
编辑:在准备示例时,我注意到,如果不像我在程序中那样使用透明度,则几乎无法观察到效果。也许应该提到这一点。这是我想出的:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JPanel;
import com.sun.awt.AWTUtilities;
public class Test {
static boolean flag = false;
static Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize();
public static void main(String[] args) throws InterruptedException {
JFrame frame = new JFrame();
frame.setUndecorated(true);
AWTUtilities.setWindowOpaque(frame, false); //draw on a transparent window
frame.setSize(scrSize.width, scrSize.height);
frame.setContentPane(new JPanel() {
protected void paintComponent(Graphics g)
{
if (Test.flag) {
g.setColor(Color.RED);
g.drawRect(50, 50, scrSize.width - 100, scrSize.height - 100);
}
else {
g.setColor(Color.GREEN);
g.fillOval(50, 50, scrSize.width - 100, scrSize.height - 100);
}
}
});
frame.setVisible(true); //green oval shown
Thread.sleep(1000);
frame.setVisible(false);
flag = true; // next draw produces red rectangle
Thread.sleep(1000);
frame.setVisible(true); // before the next draw,
// you can see a flash of the green oval
}
}
这是因为每个 AWT 窗口都有一个与屏幕图像保持同步的屏幕外图像。当显示窗口时,其内容直接从屏幕外图像绘制。这发生在工具包线程上,而不是事件分派线程上。
仅在显示窗口后,才会在事件分派线程上重新绘制框架。
在 Java 1.6 之前,AWT 中没有每窗口双缓冲,因此您会看到灰色背景,这就是臭名昭著的“灰色矩形”问题。
我知道的唯一解决方法是每次创建一个新框架。您可以重复使用旧框架的内容面板,因此开销不会那么高。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)