为什么在没有显式调用 repaint() 的情况下连续异步调用paintComponent()?

2024-04-26

所以这个问题有两个部分,我认为可能是相关的,而且大多是抽象的。简而言之,这就是我正在做的事情:

我有一个JFrame with a JPanel还有一些child JPanels每个有 3 个JButtons在上面。我还创建了一个JComponent called glassPanel为了JFrame (i.e. myJFrame.setGlassPane(glassPanel)),这使我能够在 JPanel 和按钮上进行绘制。

(1) 本质上是通过单击 a 上的所有 3 个按钮来触发JPanel, glassPanel被设定为Visible(这似乎然后调用paintComponent())。这与第一个问题有关。

(2) In paintComponent()我使用双缓冲 http://www.cs.tut.fi/lintula/manual/java/tutorial/uiswing/painting/overview.html, onto glassPanel。这涉及到第二个问题。

这是我的相关 GlassPanel 类代码(这不是 SSCCE,因为它现在是一个抽象问题):

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import javax.swing.JComponent;


public class GlassPanel extends JComponent {

     @Override
     protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        setDoubleBuffered(true);
        Graphics2D g2 = (Graphics2D) g;

        g2.drawRect(x,y,width,height);
        g2.fillRect(x,y,width,height);

        g2.drawImage(img, x, y, this);
    }
}

通过放置一个System.out.print在 PaintComponent() 方法中的声明,我可以告诉它被连续地和异步地调用。有关我认为如何进行调用的信息,请参阅 (1)。另外,假设我绝对确定没有人打电话给repaint()代码中的任何位置(我已经检查了很多很多次)。这是第一个问题的基础。

我第一次点击 3 个按钮时,一切都很顺利。矩形和图像都会立即绘制。但是,当我单击接下来的 3 个按钮时(此时,glassPanel已经是setVisible(true)第一个矩形和图像仍在屏幕上,绘制在前 3 个按钮上),第二个矩形和图像仅部分加载。当我点击远离JFrame并进入我运行程序的 Eclipse 窗口,调用次数paintComponent()每次快速增加相同的量并且部分加载的图像和矩形立即完全显示在背景中JFrame。当我单击返回 JFrame 时,调用数量再次增加了确切的数量)。这是第二个问题的基础。

UPDATE: Here's http://www.cs.tut.fi/lintula/manual/java/tutorial/uiswing/painting/overview.html我读过的东西:

另外,当 GUI 被另一个窗口覆盖然后变成 如果没有发现,绘画系统会调用paintComponent方法 绘画面积等于新未覆盖的面积。

我的问题是:

(1) 为什么可能paintComponent()被如此多地称为没有repaint()?或者,类似的问题,什么可能调用paintComponent()?

更新:做了一些数学计算后,我坚信每个组件(所有按钮和面板)都会不断调用它。但仍然没有调用 repaint()...

(2) 为什么图像会部分加载,直到我从 JFrame 窗口获得焦点?

请注意,我尝试了很多事情:(a)创建自己的双缓冲区并且不使用双缓冲区(我知道它主要用于动画),(b)覆盖和不覆盖paintComponent(),(c) 绘制和不绘制图像(矩形仍然需要时间来加载),(d) 绝对确保没有repaint(), (e) 使用和不使用SwingUtilities.invokeLater(new Runnable() { public void run() { //stuff});,(f)做了一个if语句仅 setVisible(true) 一次。

如果必须的话,我可以尝试通过 SSCCE,但我确实认为这些更抽象。谢谢!


嗯,我想我已经回答了这两个问题。首先,为什么 PaintComponent() 被连续调用,是因为它实际上并没有被连续调用。当它第一次显示 GUI 时,所有组件都会调用它。当 Eclipse 窗口覆盖它然后又揭开它时,它会被调用更多次。

对于第二个,它与clipBounds of the Graphics2D物体/事物。我发现如何clipBounds每次绘制调用都会发生变化,所以当我将剪辑设置在开始时paintComponent()方法,图像立即显示。 (顺便说一句,它看起来很棒!)。

稍有不同的是:显示图像后,每次单击按钮都会对图像执行一些操作。不过我还没弄清楚具体是什么。它看起来几乎就像是在旧图像上重新绘制相同的图像。

所以我必须弄清楚如何保留旧图像,但在适当的时候绘制新图像,并且仅将新图像绘制/添加到glassPanel.

更新:打电话repaint()单击每个按钮后立即有一点帮助。但当按下按钮时,它仍然会导致图像有些闪烁,就像添加了另一层一样,然后当用户松开按钮时,图像又恢复正常。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在没有显式调用 repaint() 的情况下连续异步调用paintComponent()? 的相关文章

  • Cassandra Pojo Sink Flink 中的动态表名称

    我是 Apache Flink 的新手 我正在使用 Pojo Sink 将数据加载到 Cassandra 中 现在 我在以下命令的帮助下指定表和键空间名称 Table注解 现在 我想在运行时动态传递表名称和键空间名称 以便可以将数据加载到用
  • 在 Java 中实现排列算法的技巧

    作为学校项目的一部分 我需要编写一个函数 该函数将接受整数 N 并返回数组 0 1 N 1 的每个排列的二维数组 该声明看起来像 public static int permutations int N 该算法描述于http www usn
  • 如何在 Java 9 中使用新的 BeanInfo 注解

    JEP 256 BeanInfo 注释 http openjdk java net jeps 256为JavaBean http download java net java jdk9 docs api java beans JavaBea
  • 32 位数字中 1 的数量

    我正在寻找一种在 32 位数字中包含 1 数量的方法 之间不使用循环 任何人都可以帮助我并向我提供代码或算法吗 这样做 提前致谢 See Integer bitCount int http java sun com javase 6 doc
  • 可以显式删除 lambda 的序列化支持

    As 已经知道 https stackoverflow com a 22808112 2711488很容易添加序列化当目标接口尚未继承时支持 lambda 表达式Serializable 就像 TargetInterface Seriali
  • Encog - 如何加载神经网络的训练数据

    The NeuralDataSet我在实际中看到的对象除了 XOR 之外什么都没有 它只是两个小数据数组 我无法从文档中找出任何内容MLDataSet 似乎所有内容都必须立即加载 但是 我想循环遍历训练数据 直到到达 EOF 然后将其算作
  • Spring - 两种不同的 POST 方法,具有相同的 URL,但生成的内容类型不同

    我有以下控制器 RequiredArgsConstructor RestController public class OwnerViewController implements ApiOwnerViewController privat
  • 设置 MetaspaceSize 的指南 - java 8

    64 位服务器的 MetaspaceSize 默认值是多少 我在官方文档中没有找到它 我观察到 在服务器 JVM 进程中 GC 频率有时会变高并持续增长 如果我重新启动服务几次 它就会恢复稳定 我认为这是由于 JRE 升级造成的 JVM 堆
  • Android 3.1 USB 主机 - BroadcastReceiver 未收到 USB_DEVICE_ATTACHED

    我经历过USB 主机的描述和示例位于developer android com http developer android com guide topics usb host html检测连接和分离的 USB 设备 如果我在清单文件中使用
  • Java ZIP - 如何解压缩文件夹?

    是否有任何示例代码 如何将 ZIP 中的文件夹部分解压到我想要的目录中 我已将文件夹 FOLDER 中的所有文件读取到字节数组中 如何从其文件结构创建 我不确定你所说的部分是什么意思 您的意思是在没有 API 帮助的情况下自己完成吗 如果您
  • 如何查找给定字符串中仅出现一次的第一个字符[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在生产中安全地更改会话 cookie 域或名称?

    我们最近意识到我们的会话 cookie 正在被写入我们网站的完全限定域名 www myapp com 例如 MYAPPCOOKIE 79D5DB83 domain www myapp com 我们希望将其切换为可以跨子域共享的cookie
  • 改造添加带有令牌和 ID 的标头

    我在获取经过身份验证的用户时遇到问题 在此之前我得到了令牌和用户 ID 现在我需要使用访问令牌和 ID 从服务器获取用户 我有标题格式 https i stack imgur com OQ87Y png 现在我尝试使用拦截器添加带有用户令牌
  • 飞碟中的外部 CSS

    我想知道如何在 Flying Saucer 中包含外部 CSS 在此之前THB我检查了所有可用的链接StackOverflow但它们没有帮助 这就是为什么我自己做这个的原因 TestCSS xhtml重命名版本TestCSS html 所以
  • 为什么我们在同一台服务器上使用多个应用程序服务器实例

    我想这是有充分理由的 但我不明白为什么有时我们会在同一物理服务器上放置例如 5 个具有相同 Web 应用程序的实例 这与多处理器架构的优化有关吗 JVM 或其他允许的最大内存限制 嗯 过了很长一段时间我又看到这个问题了 一台机器上的多个 J
  • Java并发锁和条件的使用

    我可以用object wait object notify and synchronized blocks解决生产者消费者类型的问题 同时我可以使用locks and conditions from java util concurrent
  • 表达式的类型必须是数组类型,但它解析为浮点数

    当我编写 Java 代码时 我遇到了困难 我觉得我不知何故把这个概念弄乱了 就像我不确定这一点 void setScore float sco sco score public void setScore float sco int id
  • java.lang.OutOfMemoryError:尝试将 Java 对象转换为 Json 字符串时的 Java 堆空间

    我尝试将 csv 文件转换为 200K 对象的 Json 文件 其中对象代表 csv 中的 1 行 我在 32 位上安装了 Java 并且项目配置 VM 参数 Xmx1024m 但是我得到 Exception in thread main
  • POJO 支持使用omnifaces 自动完成primefaces

    我正在尝试在我的项目中使用 primefaces 自动完成组件 以避免将特定转换器写入我尝试使用的每个列表对象全能面孔 http showcase omnifaces org converters ListConverter如建议的here
  • Java:将秒转换为分钟、小时和天[重复]

    这个问题在这里已经有答案了 任务是 输出应如下所示 最好回显输入 您输入了 500 000 秒 即 5 天 18 小时 53 分钟 20 秒 5天18 53 20小时 我该怎么做呢 最容易理解和做到的方法是什么 讲师还说 没有硬编码 我不太

随机推荐