轻量级组件中剪辑区域的处理与文档不匹配?

Posted

技术标签:

【中文标题】轻量级组件中剪辑区域的处理与文档不匹配?【英文标题】:Handling of clip area in lightweight components does not match documentation? 【发布时间】:2016-03-23 23:01:26 【问题描述】:

java.awt.Graphics 的文档说明如下(我添加了一些强调):

所有渲染操作仅修改位于该区域内的像素 以当前剪辑为界,该剪辑由用户中的 Shape 指定 空间并由程序使用Graphics 对象控制。这 用户剪辑被转换成设备空间并与 设备剪辑,由窗口和设备的可见性定义 范围。用户剪辑和设备剪辑的组合定义了 复合剪辑,它决定了最终的剪辑区域。 用户 渲染系统不能修改剪辑以反映 生成的复合剪辑。用户剪辑只能通过 setClipclipRect 方法。

此外,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】:

请注意,由于对实际问题的误解(我无法回答),此答案正确。我暂时将其打开,也许其他人会发现它有用。


    Componentcalls setClip()getGraphics()方法。 您可能已经知道,通常paint(Graphics) 只会被负责重绘的RepaintManager 调用。它在paint() 之前多次调用setClip()

所以,据我所知:,文档没有错。如果RepaintManagerComponent 不会调用setClip()getClip() 确实会返回null。可以查看RepaintManagerhere的完整源码。

【讨论】:

@Grodriguez 抱歉,我想我受到了swing 标签的影响。编辑对您有帮助吗?如果不是,我会删除这个答案,因为我误解了这个问题。 我认为这个答案应该在这里。它包含有用的信息,并且在某种程度上与该问题有关。 (实际上是问题的一个特例)。我认为应该编辑答案,以便观众可以理解这不是真正的正确答案,而无需阅读 cmets.. Component lightweight = new Component() - at (java.awt.Rectangle[x=0,y=0,width=142,height=161]) 使用的整个区域从JFrames ContentPane 返回getBounds,不管是有一个、两个还是三个Components 添加到JFrames ContentPane (通过使用例如 GridLayout),没有自定义绘画的 getClip 返回 ContentPane 的边界 @Ramesh-X 是的,我知道 Swing 是轻量级的。那不是问题。问题是 Javadoc 没有说明引用的文本不适用于轻量级。无论如何,正如我所说,我的示例不使用 Swing。 @mKorbel。不,我使用的是 AWT 轻量级——直接实例化 Component 而不是它的子类之一。是的,我知道 getClip 正在返回父母的界限。但我没有明确设置剪辑,所以根据 Javadocs,getClip() 应该返回 null。

以上是关于轻量级组件中剪辑区域的处理与文档不匹配?的主要内容,如果未能解决你的问题,请参考以下文章

轻量级代码生成器-OnlyCoder 第二篇

用Itextsharp 组件导出PDF 的文档的方法

Servlet在Servlet容器中运行

.NET轻量级ORM组件Dapper修炼手册

.NET轻量级ORM组件Dapper修炼手册

netcoreMiniExcel轻量级开源组件使用