.setVisible(true) 立即重绘

2023-11-21

在一个简短的方法中,我使用 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(使用前将#替换为@)

.setVisible(true) 立即重绘 的相关文章

随机推荐

  • C# REST 客户端使用 POST 发送数据

    我正在尝试向 REST Web 服务发送一个简单的 POST 请求并打印响应 代码如下 主要取自 Yahoo 开发人员文档和随部分文档提供的 MSDN 代码片段 我希望客户发送 请求方法 POST 即我期望 PHP 中的 SERVER RE
  • 使用 Android sqlite 数据库的自定义文件

    是否可以为 sqlite 数据库文件选择自定义位置 如果可能的话我想将数据库文件存储在存储卡中 如果用户从一张存储卡切换到另一张存储卡 我希望我的应用程序使用卡上可用的任何版本的数据库文件 默认情况下 您的数据库存储在数据 数据 your
  • 将值传递给 IValueConverter

    我有一个ListView有一个Grid有两列和许多行 每行都有一个TextBlock在每一列中Text属性绑定到 ListView 中的值ItemSource 我需要在第二个中对文本进行一些转换TextBlock取决于第一个值TextBlo
  • Bootstrap 4 导航栏固定在内容上方

    我正在使用 bootstrap4 固定顶部导航栏 它在普通浏览器中工作正常 但是 当我在移动设备 使用 chrome 开发选项的 Galaxy S5 上进行测试时 内容从导航栏后面开始 我在 CSS 中尝试了一些填充 但似乎无法让它正常工作
  • 如何确保在实体框架中使用存储库模式时创建代理?

    我的 SurveyController 类中有这个方法 public ActionResult AddProperties int id int propertyids int page 1 var survey uow SurveyRep
  • 如何对未签出的分支进行非快进 git 合并?

    我在树枝上a 我想合并分支b进入分支c 合并不是快进 但也不需要手动解析 也就是说 这不是最简单的情况 但也不是最困难的情况 因此这是 Git 无需人工即可自行完成的合并 有没有办法让我进行此合并b to c无需检查任何分支机构 如何 UP
  • Google Analytics v4 - 数据未显示在仪表板上

    我一直致力于将 Google Analytics v4 集成到我的应用程序中 我已经遵循了这个 https developers google com analytics devguides collection android v4 但是
  • 大量使用ViewBag

    我在 MVC 应用程序中大量使用 ViewBag 这被认为是不好的做法吗 我不确定是否要花时间创建 ViewModel 但我认为这更适合 MVVM 而不是 MVC 还是继续大量使用 ViewBag 支持和反对这一点的论据是什么 示例控制器方
  • 使用 PHP 通过表单发布 URL 时触发错误 403

    我在 apache 共享主机上使用 PHP 通过表单发布 URL 时遇到 403 Forbidden 错误 从现有的问题 表单提交时出现 403 错误 这很可能是由服务器上安装的 mod security 引起的 由于我使用共享托管 我无法
  • 找不到模块的声明文件

    我正在尝试使用我创建的 nodejs 包 有人可以指出我做错了什么吗 包结构如下 node modules my commons dist src helpers d ts helpers js index d ts index js no
  • 安卓。 SQLite异常:没有这样的列_id

    我在尝试获取存储在数据库中的信息并将其显示在 ListView 中时遇到一些麻烦 这是我想显示行的 ListActivity public class Prueba extends ListActivity Called when the
  • 如何在不使用数据库的情况下轻松存储持久数据?

    我正在尝试使用 Android 应用程序类 MyApplication java 将数据存储在一些字符串和整数的 ArrayList 中 我希望这些数据能够像数据库一样永久存储 但不使用数据库 简化我的应用程序 目前数据已存储 当我退出应用
  • 列出 sbt 1.2.8 中资源目录中的文件

    我有一个 Scala 应用程序 它处理来自某个目录的二进制文件resources 我想得到这个目录java io File并列出所有内容 在最新的 sbt 中 我无法直接做到这一点 我已经针对我的问题创建了最小的存储库 https gith
  • Symfony2 FOSUserBundle 角色实体

    我目前正在尝试找出将教义持久角色实体实现为与 FOSUserBundle 兼容的 M2M 关系的最佳方法 以前 我仅使用默认实现的字符串 并使用学说数组映射来持久化它 现在我需要将角色作为单独的实体 因为我们想要构建一个管理后端 其他人可以
  • 比较 ruby​​ 中的对象

    考虑一下 class Aaa attr accessor a b end x Aaa new x a x b 1 2 y Aaa new y a y b 1 2 puts x y gt false 有没有办法检查相同类型的类中的所有公共属性
  • 从之前的位置恢复 webapp?

    我有一个网络应用程序 它存储用户的数据 以便他们在 iPhone 上的主屏幕应用程序模式下单击外部链接并离开应用程序以查看网页或类似内容 当他们返回网络应用程序时 如何在同一位置恢复 目前它不会到达相同的位置 它重定向到主页我希望它从以前的
  • C 和 C++ 执行时间的差异

    我最近发现了这个名为 codechef 的网站 您可以在其中提交问题的解决方案 我为一个问题提交了两个答案 一个用 C 语言 另一个用 C 语言 两个代码几乎相同 但是当我用C提交的代码在4 89s执行时 我用C 提交的代码超时了 超过8秒
  • 创建文件 获取文件时间 设置文件时间

    我在使用 GetFileTime 和 SetFileTime 时遇到问题 当涉及到目录时 具体来说我认为我的问题是 我是 WinAPI 的新手 我认为我没有得到 正确处理 有两种情况 首先 我只需要一个句柄来获取文件或目录 时间戳 创建 访
  • 类型错误:格式字符串参数不足 - 使用 %Y-%m 时 Python SQL 连接

    with engine connect as con rs con execute SELECT datediff STR TO DATE CONCAT year month day Y m d current date from TABL
  • .setVisible(true) 立即重绘

    在一个简短的方法中 我使用 setVisible false 隐藏 JFrame 然后我截取屏幕截图并使用 setVisible true 恢复 JFrame 再次可见后 窗口应该显示与之前不同的图片 假设截取的屏幕截图的一部分 问题是 在