【问题标题】:Identify the dirty region for a Graphics2D when repainting in Swing在 Swing 中重绘时识别 Graphics2D 的脏区
【发布时间】:2014-01-07 22:05:42
【问题描述】:

当使用Graphics2D 对象时,找出目标缓冲区的哪一部分需要重绘的正确方法是什么,或者,如果需要重绘整个缓冲区,目标缓冲区的尺寸是多少?

目标缓冲区可以是BufferedImageAWT 组件或打印时使用的虚拟设备。对于某些操作,例如用图案平铺背景,即使没有优化重绘的意图,也有必要知道需要绘制哪个区域。

我尝试使用Graphics.getClipBounds(),但有时会返回null

我假设有一些类似于Rectangle2D getInvaidRegion()Rectangle2D getDestinationBufferSize() 的方法

【问题讨论】:

  • 我不明白你的意思?为什么需要重绘哪个部分?
  • @TimB 我能找到的最接近的是 .NET 框架中的等效项:PaintEventArgs.ClipRectangle。像往常一样,描述是不存在的,但它的作用如下:事件的这个属性总是告诉你需要重绘后备缓冲区的哪一部分。这可能是整个缓冲区的区域,也可能只是其中的一部分,前提是只有部分缓冲区已失效。
  • 所以这是 Swing 重绘请求进来的时候,所以你知道要重绘的脏区吗?
  • @TimB 是的,这是一个有用的实例。但我正在寻找一种解决方案,该解决方案在需要重绘整个组件或绘制到 Swing 组件以外的东西时也可以使用。
  • @TimB 现在我才看到您更改了问题的标题和其他人的标签,完全改变了上下文!我对仅在绘制 Swing 组件时的解决方案不感兴趣。我在问 Java 图形 API 是否有一种通用的方法来定义需要实际绘制的区域。

标签: java swing awt graphics2d


【解决方案1】:

在 Swing 中,有几种不同的方式可以要求您重绘。

最简单的方法是覆盖 paintComponent 并绘制所有内容,为您处理边框和子组件。

接下来最复杂的是覆盖paint。您现在需要处理边框和子组件。

你终于有了可以覆盖的paintImmediately

http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#paintImmediately%28int,%20int,%20int,%20int%29

这是关于脏区的通知,但对您的作用很小。

【讨论】:

  • paintImmediately 必须从 EDT 中调用,否则会导致 RepaintManager 出现一些严重异常,然后取决于异常 tyoe(s),但在某些情况下,结果可能是 Swing GUI 可以从仅限任务管理器
  • 结果可能是覆盖RepaintManager(可以意外地决定某些像素可以或不能重绘)或使用重绘(x,x,x,x .... )
  • 如果我绘制到BufferedImagejava.awt.print.Printable.print() 的实现会发生什么?我是否需要为这些情况中的每一种情况特殊化绘制代码?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 2013-08-20
  • 1970-01-01
  • 2013-02-04
  • 2015-06-09
  • 2018-04-11
  • 2017-06-30
相关资源
最近更新 更多