setOpaque(true / false); java

在Java2D中,当您使用setOpaque时,我对true和false的含义有些困惑。

例如,我知道在Swing中,不透明意味着在绘制Swing时不会绘制组件后面的内容。还是倒退?哪一个?

谢谢

回答:

对于您的问题的简短回答是,“不透明”在英语中被定义为完全不透明。因此,不透明的组件是一个绘制其整个矩形的组件,并且每个像素都不完全透明。

但是,Swing组件不透明性API是设计不当且因此经常被误用的API之一。

要理解的重要一点isOpaque是Swing系统与特定组件之间的 契约 。如果返回true,则组件保证不透明地绘制其矩形区域的每个像素。该API

应该 是抽象的,以强制所有组件编写者都考虑使用它。isOpaqueSwing的绘制系统使用该API来确定是否必须为给​​定组件所覆盖的区域绘制

的组件,包括组件的容器和祖先。如果某个组件对该API返回true,则Swing系统可能会优化绘制,以在调用特定组件的绘制方法之前不对该区域进行任何绘制。

由于的合约含义isOpaque,该API setOpaque不应该

存在,因为它实际上对于外部调用而言是不正确的,setOpaque因为外部对象又不知道所讨论的组件是否(或什至)可以接受它。取而代之的是,isOpaque应该已被每个具体组件覆盖,以返回给定其当前属性是否实际上是不透明的。

因为该setOpaqueAPI 确实

存在,所以许多组件都错误地实现了它(相当可以理解),以驱动它们是否绘制其“背景”(例如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

回到顶部