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

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

谢谢

最佳答案

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

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

重要的是要了解isOpaque是Swing系统与特定组件之间的协定。如果返回true,则组件保证不透明地绘制其矩形区域的每个像素。该API应该是抽象的,以强制所有组件编写者都考虑使用它。 Swing的绘画系统使用isOpaque API来确定是否必须对给定组件覆盖的区域进行绘画(重叠的组件和后面的组件,包括组件的容器和祖先)。如果某个组件对该API返回true,则Swing系统可能会优化绘制,以在调用特定组件的绘制方法之前不对该区域进行任何绘制。

由于isOpaque的契约(Contract)含义,API setOpaque不应该存在,因为它对于外部调用setOpaque的任何内容实际上都是不正确的,因为外部的东西反过来也不知道所涉及的组件是否(或什至)可以兑现它。取而代之的是,isOpaque应该已被每个具体组件覆盖,以返回给定其当前属性,实际上是否为不透明。

因为setOpaque API确实存在,所以许多组件都错误地实现了它(很容易理解),以驱动它们是否绘制其“背景”(例如JLabel和JPanel用其背景颜色填充)。这样做的效果是给API用户带来印象,认为setOpaque驱动该背景是否应该绘制,但不是。

此外,例如,如果您希望用半透明的背景绘制JLabel,则需要使用alpha值设置背景色,并执行setOpaque(true),但它实际上并不透明-它是半透明的;它后面的组件仍需要绘画以使组件正确渲染。

Java 6的新Nimbus Look&Feel显着地暴露了此问题。关于针对Nimbus提交的透明组件,有许多错误报告(请参阅堆栈溢出问题Java Nimbus LAF with transparent text fields)。 Nimbus开发团队的回应是:



因此,总而言之,您不应使用setOpaque。如果您确实使用它,请记住,某些外观和某些组件的组合可能会使您感到“惊讶”。最后,实际上没有正确的答案。

关于java - setOpaque(true/false); java ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2451990/

10-11 20:46