setOpaque(true/false);爪哇岛
在Java2D中,当你使用setOpaque时,我对真假的作用有点困惑。
例如,我知道在Swing Opaque中意味着在绘画Swing时不会绘制组件后面的内容。还是倒退了?哪一个是它?
谢谢
在Java2D中,当你使用setOpaque时,我对真假的作用有点困惑。
例如,我知道在Swing Opaque中意味着在绘画Swing时不会绘制组件后面的内容。还是倒退了?哪一个是它?
谢谢
对你的问题的简短回答是,“不透明”在英语中被定义为完全不透明。因此,不透明组件是绘制其整个矩形的组件,并且每个像素在任何程度上都不是半透明的。
但是,Swing 组件不透明度 API 是设计错误且经常使用不当的 API 之一。
重要的是要理解,这是Swing系统和特定组件之间的契约。如果它返回 true,则组件保证以非半透明方式绘制其矩形区域的每个像素。这个API应该是抽象的,以迫使所有组件编写者考虑它。Swing 的绘画系统使用该 API 来确定是否必须为与给定组件重叠且位于其后面的组件(包括组件的容器和祖先)绘制给定组件覆盖的区域。如果组件返回到此 API,则 Swing 系统可能会优化绘制,以便在调用特定组件的绘制方法之前不绘制该区域中的任何内容。isOpaque
isOpaque
由于 合同含义,API 不应该存在,因为调用外部任何东西实际上都是不正确的,因为反过来,外部事物无法知道所讨论的组件是否会(甚至能够)遵守它。相反,isOpaque 应该被每个具体组件覆盖,以返回它是否实际上在不透明,因为它的当前属性。isOpaque
setOpaque
setOpaque
因为API确实存在,所以许多组件错误地实现了它(完全可以理解)来驱动它们是否会绘制它们的“背景”(例如JLabel和JPanel填充它们的背景颜色)。这样做的效果是给API的用户创造一种印象,认为这决定了背景是否应该绘制,但事实并非如此。setOpaque
setOpaque
此外,例如,如果您希望使用半透明背景绘制JLabel,则需要设置具有alpha值的背景颜色,并且确实这样做,但它实际上并不不透明 - 它是半透明的;它后面的组件仍然需要绘制,以便组件正确呈现。setOpaque(true)
这个问题在Java 6的新Nimbus Look & Feel中得到了显着的暴露。有许多关于针对 Nimbus 的透明组件的错误报告(请参阅带有透明文本字段的堆栈溢出问题 Java Nimbus LAF)。Nimbus开发团队的回应是这样的:
这是Swing的原始设计中的一个问题,以及它多年来一直令人困惑的方式。问题是setOpaque(false)在[现有]LAFs中产生了副作用,即隐藏背景,而背景并不是它[意思]的真正目的。[意思是]说组件可能有透明部件,[Swing]应该在它后面绘制父组件。
因此,总而言之,您不应该使用.如果您确实使用它,请记住,一些外观和感觉以及某些组件的组合可能会做“令人惊讶”的事情。而且,最终,实际上没有正确的答案。setOpaque
javadoc说:如果为真,组件将在其范围内绘制每个像素。否则,组件可能不会绘制其部分或全部像素,从而允许下层像素显示出来。
也试试这个示例程序...http://www.java2s.com/Code/JavaAPI/javax.swing/JPanelsetOpaquebooleanisOpaque.htm