12 java graphics swing java-2d
在Java2D中,当你使用setOpaque时,我对true和false的作用有点困惑.
例如,我知道在Swing Opaque中意味着在绘制Swing时不会绘制组件后面的内容.或者这是倒退?哪一个?
谢谢
Law*_*Dol 48
对你的问题的简短回答是,"不透明"在英语中被定义为完全不透明.因此,不透明的组件是绘制整个矩形的组件,并且每个像素在任何程度上都不是半透明的.
但是,Swing组件opacity API是那些设计错误的API之一,因此经常使用不当的API.
什么理解重要的是,isOpaque
是一个合同的摆动系统和特定组件之间.如果它返回true,则组件保证非半透明地绘制其矩形区域的每个像素.此API 应该是抽象的,以强制所有组件编写者考虑它.该isOpaque
API用于通过Swing的绘制系统,以确定由给定的组件所覆盖的区域是否必须涂为重叠它的,哪些是它后面的部件,包括该组件的容器和祖先.如果组件对此API返回true,则Swing系统可以优化绘制,以便在调用特定组件的绘制方法之前不在该区域中绘制任何内容.
由于合同含义isOpaque
,API setOpaque
不应该存在,因为它实际上对于调用外部的任何东西都是不正确的,setOpaque
因为外部事物无法知道所讨论的组件是否(甚至可以)尊重它.相反,isOpaque应该被每个具体组件覆盖,以返回它实际上是否实际上是不透明的,因为它的当前属性.
因为setOpaque
API 确实存在,所以很多组件都错误地实现了它(完全可以理解)来驱动它们是否会绘制它们的"背景"(例如JLabel和JPanel填充它们的背景颜色).这样做的结果是为API的用户创建一个印象,认为setOpaque
驱动该背景是否应该绘制,但事实并非如此.
此外,如果您想要绘制具有半透明背景的JLabel,您需要设置具有alpha值的背景颜色,并执行setOpaque(true),但它实际上不是不透明的 - 它是半透明的 ; 它背后的组件仍然需要绘制,以便组件正确呈现.
使用Java 6的新Nimbus Look&Feel,这个问题以一种重要的方式暴露出来.关于针对Nimbus提交的透明组件有很多错误报告(请参阅堆栈溢出问题Java Nimbus LAF和透明文本字段).Nimbus开发团队的反应如下:
这是Swing的原始设计中的一个问题,以及它多年来一直令人困惑的问题.问题是setOpaque(false)在[现有] LAF中产生了一个副作用,即隐藏背景并不是它的意思.这意味着组件可能具有透明部分,[Swing]应该在其后面绘制父组件.
所以,总之,你不应该使用setOpaque
.如果您确实使用它,请记住,一些外观和感觉以及某些组件的组合可能会"令人惊讶".最后,实际上没有正确的答案.