轻量级组件中剪辑区域的处理与文档不匹配?
Posted
技术标签:
【中文标题】轻量级组件中剪辑区域的处理与文档不匹配?【英文标题】:Handling of clip area in lightweight components does not match documentation? 【发布时间】:2016-03-23 23:01:26 【问题描述】:java.awt.Graphics
的文档说明如下(我添加了一些强调):
所有渲染操作仅修改位于该区域内的像素 以当前剪辑为界,该剪辑由用户中的
Shape
指定 空间并由程序使用Graphics
对象控制。这 用户剪辑被转换成设备空间并与 设备剪辑,由窗口和设备的可见性定义 范围。用户剪辑和设备剪辑的组合定义了 复合剪辑,它决定了最终的剪辑区域。 用户 渲染系统不能修改剪辑以反映 生成的复合剪辑。用户剪辑只能通过setClip
或clipRect
方法。
此外,getClip()
方法的文档说:
获取当前剪辑区域。此方法返回用户剪辑, 它独立于与设备边界相关的剪辑和 窗口可见度。 如果之前没有设置剪辑,或者如果剪辑 已使用
setClip(null)
清除,此方法返回null
。
但是,下面的示例程序会打印一个非空剪切区域:
import java.awt.*;
public class ClipTest
public static void main(String args[])
Frame f = new Frame();
f.setLayout(new BorderLayout());
f.setSize(300,200);
Component lightweight = new Component()
public void paint(Graphics g)
System.out.println(g.getClip());
;
f.add(lightweight);
f.setVisible(true);
我是否忽略了某些东西,或者这是规范或实现中的错误?
更新:
上面的代码没有使用 Swing。它使用普通的 AWT。我将问题标记为“swing”,因为这也发生在 Swing 中,但它不是 Swing 特定的。 此外,我不是在问“为什么”会发生这种情况。我研究了源代码,我可以看到在某些情况下内部调用了 setClip()。但这似乎与 Javadocs 所说的不符(参见上面引用的部分)。因此我的问题是:这是实现或规范中的错误,还是我只是遗漏了什么?【问题讨论】:
绘制组件时,剪切矩形会自动设置为组件边界。你必须记住,Graphics
用于更多的事情,而不仅仅是绘制组件;)
@MadProgrammer 是的,我知道。正如更新所说,我不是在问为什么会发生这种情况,而是在问正在发生的事情与 Javadocs 之间的明显不匹配。
【参考方案1】:
好的,答案似乎在java.awt.Component.paint(Graphics)
的文档中,上面写着:
当组件的内容应该是时调用该方法 绘;例如当组件首次展示或损坏时 并且需要维修。
Graphics
参数中的剪辑矩形是 设置为需要绘制的区域。
这是我遗漏的一些信息。
【讨论】:
【参考方案2】:请注意,由于对实际问题的误解(我无法回答),此答案不正确。我暂时将其打开,也许其他人会发现它有用。
Component
calls setClip()
的getGraphics()
方法。
您可能已经知道,通常paint(Graphics)
只会被负责重绘的RepaintManager
调用。它在paint()
之前多次调用setClip()
。
所以,据我所知:不,文档没有错。如果RepaintManager
或Component
不会调用setClip()
,getClip()
确实会返回null
。可以查看RepaintManager
here的完整源码。
【讨论】:
@Grodriguez 抱歉,我想我受到了swing
标签的影响。编辑对您有帮助吗?如果不是,我会删除这个答案,因为我误解了这个问题。
我认为这个答案应该在这里。它包含有用的信息,并且在某种程度上与该问题有关。 (实际上是问题的一个特例)。我认为应该编辑答案,以便观众可以理解这不是真正的正确答案,而无需阅读 cmets..
Component lightweight = new Component() - at (java.awt.Rectangle[x=0,y=0,width=142,height=161])
使用的整个区域从JFrame
s ContentPane
返回getBounds,不管是有一个、两个还是三个Components
添加到JFrame
s ContentPane
(通过使用例如 GridLayout),没有自定义绘画的 getClip 返回 ContentPane 的边界
@Ramesh-X 是的,我知道 Swing 是轻量级的。那不是问题。问题是 Javadoc 没有说明引用的文本不适用于轻量级。无论如何,正如我所说,我的示例不使用 Swing。
@mKorbel。不,我使用的是 AWT 轻量级——直接实例化 Component
而不是它的子类之一。是的,我知道 getClip 正在返回父母的界限。但我没有明确设置剪辑,所以根据 Javadocs,getClip() 应该返回 null。以上是关于轻量级组件中剪辑区域的处理与文档不匹配?的主要内容,如果未能解决你的问题,请参考以下文章