setOpaque(真/假); Java的

Java2D中,当您使用setOpaque时,我对某些真假做了一些困惑.

例如我知道在Swing Opaque意味着当绘画Swing不会画什么在组件后面.还是这个倒退?哪一个?

谢谢

解决方法

你的问题的简短答案是“不透明”是用英语定义为完全不透明的.因此,不透明组件是绘制整个矩形的组件,并且每个像素在任何程度上都不是半透明的.

但是,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&感觉和一些组件可能会“令人惊讶”的事情.而且,最终实际上没有正确的答案.

相关文章

ArrayList简介:ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增...
一、进程与线程 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程...
本文为博客园作者所写: 一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 简单的一个类...
#############java面向对象详解#############1、面向对象基本概念2、类与对象3、类和对象的定义格式4、...
一、什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错。在java中,阻止当前方法或作用域...
Collection接口 Collection接口 Collection接口 Collection是最基本的集合接口,一个Collection代表一组...