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.
# 1 楼答案
我认为还需要补充以下内容:
术语不透明在Java2D和Swing中有不同的含义
在Java中,2D不透明度是一个渲染概念。这是一个组合 alpha值和
Composite
模式。这是一个学位 绘制的像素颜色应与像素颜色混合 值已经存在。例如,我们画一个半透明的 现有椭圆形上的矩形。因此,椭圆形是 部分可见。这个概念常被比作光 通过玻璃或水的槽在Swing中,不透明组件绘制其内部的每个像素 矩形边界。非不透明组件仅绘制图形的子集 它的像素或根本没有,允许它下面的像素 展示出来。出于效率原因设置不透明属性;摆动 不必在不透明组件后面绘制区域
来源:Java文档和肮脏的富客户端
在代码示例中,我们有两个组件。左侧的组件是一个面板,它使用
AlphaComposite
在椭圆形上绘制一个高度半透明的矩形。右侧的组件是一个标签。标签在大多数外观中是不透明的。我们覆盖标签的isOpaque()
方法来设置灰色背景# 2 楼答案
对你的问题的简短回答是,“不透明”在英语中被定义为完全不透明。因此,不透明组件是绘制整个矩形的组件,而每个像素在任何程度上都不是半透明的
然而,Swing组件不透明API是设计错误的API之一,因此经常被错误使用
重要的是要理解
isOpaque
是Swing系统和特定组件之间的契约。如果像素的每个区域都是非半透明的,则它将保证其矩形区域返回为true。这个API 应该是抽象的,强迫所有的编写者考虑它。Swing的绘制系统使用isOpaque
API来确定给定组件覆盖的区域是否必须为重叠的组件和位于其后面的组件(包括组件的容器和祖先)绘制。如果组件对此API返回true,Swing系统可能会优化绘制,以在调用特定组件的绘制方法之前不在该区域绘制任何内容由于
isOpaque
的合同含义,APIsetOpaque
不应该存在,因为任何外部调用setOpaque
实际上都是不正确的,因为反过来,外部事物不知道所讨论的组件是否会(甚至可以)遵守它。相反,每个混凝土构件都应该覆盖isOpaque,以返回它在给定其当前属性的情况下是否实际上是不透明的由于
setOpaque
API确实存在,许多组件错误地实现了它(可以理解),以驱动它们是否绘制“背景”(例如,JLabel和JPanel用背景色填充)。这样做的效果是让API的用户产生一种印象,认为setOpaque
决定了背景是否应该绘制,但事实并非如此此外,如果您希望使用半透明背景绘制JLabel,则需要使用alpha值设置背景颜色,并执行
setOpaque(true)
,但实际上它不是不透明的-它是半透明的;它后面的组件仍然需要绘制,以便组件正确渲染这个问题在Java6的新Nimbus外观&;感觉有许多关于针对Nimbus的透明组件的bug报告(请参阅堆栈溢出问题Java Nimbus LAF with transparent text fields)。Nimbus开发团队的反应是:
因此,总而言之,您不应该使用
setOpaque
。如果您确实使用它,请记住,某些外观和;感觉和一些组件可能会做“令人惊讶”的事情。最后,实际上没有正确的答案# 3 楼答案
javadoc表示:如果为true,组件将在其边界内绘制每个像素。否则,组件可能无法绘制其部分或全部像素,允许底层像素显示出来
也试试这个示例程序。。。 http://www.java2s.com/Code/JavaAPI/javax.swing/JPanelsetOpaquebooleanisOpaque.htm