【问题标题】:Java paintComponent tell if called againJava paintComponent 判断是否再次调用
【发布时间】:2016-09-16 14:31:42
【问题描述】:

在谷歌上搜索了几天,我不知道如何判断在处理paintComponent 时是否调用了paintComponent。这个过程漫长而复杂。如果我有第二个(或第三个)绘画请求,我想中止当前的绘画过程并从最近的请求重新开始。

【问题讨论】:

  • "..paintComponent。过程漫长而复杂。" 那就是需要解决的问题。不应在绘制方法中完成或调用“长时间运行的任务”。
  • @AndrewThompson “不应在绘制方法中完成或调用‘长时间运行的任务’。”您实际上是在说 Java 无法处理长时间运行的视觉算法。我认为您的意思是应该将长时间运行的视觉算法作为单独的线程启动以快速关闭绘制方法。尝试提供更多信息,减少刻薄。

标签: java swing paintcomponent


【解决方案1】:

你不能;对paintComponent() 的调用被排队,阻塞EDT 直到完成。使用AnimationTest 中显示的方法在典型目标平台上对您的实现进行自我计时。根据需要进行优化。作为一个具体示例,KineticModel 说明了可能适用于您的用例的几种动画技术。

附录:您的更新表明“漫长而复杂”的过程涉及构建BufferedImage 以供以后显示。为避免阻塞 EDT,请在 SwingWorker 的背景下执行此操作,您可以从中获得 publish() 中间结果,因为它们变得可用。这个example 模拟一次一行地构建光栅图像。

这个相关的example以类似的方式构造一个TexturePaint

如需具体指导,请编辑您的问题以包含 Minimal, Complete, and Verifiable example,以显示您修改后的方法。

【讨论】:

    【解决方案2】:

    像往常一样,我在请求一个解决方案后想到了一个解决方案……我的解决方案是启动一个线程,逐步更新一个 BufferedImage。那么,paintComponent 方法就只有两行代码了:

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(myImage, 0, 0, null);
    }
    

    图像绘制得非常快。在重绘图像之前,需要调用 super 来擦除图像的现有视图。

    解决方案的其余部分是创建一个更新面板的 myImage 属性的线程。在我的工作中,图像需要大约 30 分钟才能完全处理,具体取决于程序的输入。除非我在应用程序运行时拖动窗口或意外触摸鼠标滚轮,否则这没什么大不了的。然后,再次调用paintComponent 并挂起程序。使用此解决方案,更新可能需要几天时间,您可以根据需要调整窗口大小或移动窗口。到目前为止,您仍然可以看到已处理的图像。

    【讨论】:

    • 您可以通过两个缓冲图像来解决鼠标滚轮碰撞问题。 paintComponent 方法绘制 myOldImage。在 myImage 完成渲染之前,myOldImage 不会更新。我很好奇为什么您的图像需要 30 分钟左右才能渲染。也许你可以先做计算,然后在 myImage 上绘图。
    • 我不确定这是对问题的回答。它肯定会导致您遇到的那种问题。请编辑您的问题以反映您的用例。我更新了我的答案,引用了两个相关的例子。
    猜你喜欢
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    相关资源
    最近更新 更多