gpt4 book ai didi

java - 后台缓冲区 VolatileImage 调整大小

转载 作者:行者123 更新时间:2023-12-01 04:49:08 25 4
gpt4 key购买 nike

我的 Java 小程序中的后台缓冲区有一个小问题。目前我还没有考虑在运行时调整我的小程序的大小。因此,面板的大小会调整,而我的后缓冲区保持其初始大小。因此,只有我的小程序的一部分被重绘,该部分被我的图像大小覆盖。尽管如此,我还是尝试使用重新初始化图像

private void createBackBuffer() {
backBuffer = this.getGraphicsConfiguration().createCompatibleVolatileImage(getWidth(), getHeight());
defaultComposite = ((Graphics2D) backBuffer.getGraphics()).getComposite();
defaultStroke = ((Graphics2D) backBuffer.getGraphics()).getStroke();
}

// Reinit on resize
public void adjustBackBufferSize() {
if (backBuffer != null) {
backBuffer.flush();
createBackBuffer();
}
}

不幸的是,它表现得并不欣赏。一旦用户开始拖动来调整浏览器窗口的大小,重新创建就意味着在一小段时间内没有后台缓冲区可以绘制。因此,面板闪烁,要么具有灰色背景,面板曾经具有,要么是我要渲染的实际绘图。

我考虑在调整大小时设置宽度和高度的偏移量以降低闪烁行为,但这似乎仍然不是正确的方法,只是一种解决方法。

有什么建议可以调整大小而不闪烁吗?!

亲切的问候。

最佳答案

问题:不需要的重绘

出现闪烁是因为面板正在重新绘制自身。这些重新绘制是不需要的,因为您不希望窗口开始闪烁。如果您禁用自动重绘,那么您将可以控制小程序何时重绘。您可以做的是更改代码以在新缓冲区初始化后执行重绘。


解决方案,第 1 部分:禁用重绘

您应该尝试以下操作:

setIgnoreRepaint(true);

如果这不起作用,请尝试使用 main() 方法将其添加到类中:

static {
System.setProperty("sun.awt.noerasebackground", "true");
}

这应该会为您禁用自动重绘,但可能需要指示其他一些组件不要自动重绘自身。如果您发布 SSCCE,我可以为您提供更多帮助。另外,运行一些测试来查看您的应用程序是否仍然正常工作 - 您可能需要添加一些 repaint() 调用,例如在最小化和恢复期间。


解决方案,第 2 部分:按需重绘

由于您希望在 backBuffer 初始化之后进行重绘,因此请将代码更改为:

    // Reinit on resize
public void adjustBackBufferSize() {
if (backBuffer != null) {
backBuffer.flush();
createBackBuffer();
repaint();
}
}

关于java - 后台缓冲区 VolatileImage 调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15293938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com