setOpaque(true / false); java
在Java2D中,当您使用setOpaque时,我对true和false的含义有些困惑。
例如,我知道在Swing中,不透明意味着在绘制Swing时不会绘制组件后面的内容。还是倒退?哪一个?
谢谢
回答:
对于您的问题的简短回答是,“不透明”在英语中被定义为完全不透明。因此,不透明的组件是一个绘制其整个矩形的组件,并且每个像素都不完全透明。
但是,Swing组件不透明性API是设计不当且因此经常被误用的API之一。
要理解的重要一点isOpaque
是Swing系统与特定组件之间的 契约 。如果返回true,则组件保证不透明地绘制其矩形区域的每个像素。该API
应该 是抽象的,以强制所有组件编写者都考虑使用它。isOpaque
Swing的绘制系统使用该API来确定是否必须为给定组件所覆盖的区域绘制
的组件,包括组件的容器和祖先。如果某个组件对该API返回true,则Swing系统可能会优化绘制,以在调用特定组件的绘制方法之前不对该区域进行任何绘制。
由于的合约含义isOpaque
,该API setOpaque
不应该
存在,因为它实际上对于外部调用而言是不正确的,setOpaque
因为外部对象又不知道所讨论的组件是否(或什至)可以接受它。取而代之的是,isOpaque应该已被每个具体组件覆盖,以返回给定其当前属性是否实际上是不透明的。
因为该setOpaque
API 确实
存在,所以许多组件都错误地实现了它(相当可以理解),以驱动它们是否绘制其“背景”(例如JLabel和JPanel用其背景颜色填充)。这样做的效果是给API
用户 带来印象,以setOpaque
驱动该背景是否应该绘制,但不是。
此外,例如,如果您希望用半透明的背景绘制JLabel,则需要设置具有alpha值的背景色,然后执行do
setOpaque(true)
,但它实际上并不是不透明的-它是 半透明的 ;它后面的组件仍然需要绘画以使组件正确渲染。
Java 6的新Nimbus Look&Feel显着地暴露了此问题。关于针对Nimbus提交的透明组件,有许多错误报告)。Nimbus开发团队的回应是:
这是Swing原始设计中的一个问题,并且多年来一直令人困惑。问题是setOpaque(false)在[现有的]
LAF中具有副作用,即隐藏背景,这并不是其真正意义。可以说该组件可能具有透明部分,而[Swing]应该在其后面绘制父组件。
因此,总而言之,您不应使用setOpaque
。如果您确实使用它,请记住,某些外观和某些组件的组合可能会使您感到“惊讶”。最后,实际上没有正确的答案。
以上是 setOpaque(true / false); java 的全部内容, 来源链接: utcz.com/qa/398529.html