解决方法
但是,Swing组件不透明度API是错误设计的,因此经常被误用的API之一.
重要的是要知道,Opaque是Swing系统和特定组件之间的契约.如果它返回true,则组件保证非半透明地绘制其矩形区域的每个像素.该API应该是抽象的,以强制所有组件作者考虑. isOpaque API由Swing的绘画系统使用,以确定给定组件覆盖的区域是否必须为与其重叠的组件以及其背后的组件(包括组件的容器和祖先)进行绘制.如果一个组件返回true到这个API,则Swing系统可以优化绘图,以便在调用特定组件的paint方法之前不绘制该区域中的任何内容.
由于isOpaque的合同含义,API setOpaque不应该存在,因为事实上外部调用setOpaque是不正确的,因为外部事物不能知道该组件是否(甚至可以)荣誉它.相反,isOpaque应该被每个具体组件覆盖,以返回其实际上是否是实际上是不透明的,因为它是当前的属性.
由于setOpaque API确实存在,许多组件已经错误地实现了它(很可以理解)来驱动它们是否绘制其“背景”(例如JLabel和JPanel填充其背景颜色).这样做的结果是为API创建一个印象,认为该setOpaque驱动器是否应该绘制该背景,但不会.
另外,如果你想用一个半透明的背景画一个JLabel,你需要设置一个alpha值的背景颜色,并且做setOpaque(true),但实际上并不是不透明的 – 它是半透明的;它后面的组件仍然需要绘制,以使组件正常呈现.
Java 6的新Nimbus Look& amp;感觉.有关针对Nimbus提交的透明组件的许多错误报告(参见堆栈溢出问题Java Nimbus LAF with transparent text fields). Nimbus开发团队的回应是:
This is a problem [in] the orginal design of Swing and how it has been confusing for years. The issue is setOpaque(false) has had a side effect in [existing] LAFs which is that of hiding the background which is not really what it is [meant] for. It is [meant] to say that the component may have transparent parts and [Swing] should paint the parent component behind it.
所以,总而言之,你不应该使用setOpaque.如果你使用它,请记住,一些Look&感觉和一些组件可能会“令人惊讶”的事情.而且,最终实际上没有正确的答案.