当前位置: 首页 > 面试题库 >

setOpaque(true / false); java

聂奇
2023-03-14
问题内容

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

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

谢谢


问题答案:

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

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

要理解的重要一点isOpaque是Swing系统与特定组件之间的 契约 。如果返回true,则组件保证不透明地绘制其矩形区域的每个像素。该API
应该 是抽象的,以强制所有组件编写者都考虑使用它。isOpaqueSwing的绘制系统使用该API来确定是否必须为给​​定组件所覆盖的区域绘制
与之重叠且位于其后方

的组件,包括组件的容器和祖先。如果某个组件对该API返回true,则Swing系统可能会优化绘制,以在调用特定组件的绘制方法之前不对该区域进行任何绘制。

由于的合约含义isOpaque,该API setOpaque 不应该
存在,因为它实际上对于外部调用而言是不正确的,setOpaque因为外部对象又不知道所讨论的组件是否(或什至)可以接受它。取而代之的是,isOpaque应该已被每个具体组件覆盖,以返回给定其当前属性是否实际上是不透明的。

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

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

Java 6的新Nimbus Look&Feel显着地暴露了此问题。关于针对Nimbus提交的透明组件,有许多错误报告)。Nimbus开发团队的回应是:

这是Swing原始设计中的一个问题,并且多年来一直令人困惑。问题是setOpaque(false)在[现有的]
LAF中具有副作用,即隐藏背景,这并不是其真正意义。可以说该组件可能具有透明部分,而[Swing]应该在其后面绘制父组件。

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



 类似资料:
  • 问题内容: 如果我这样做: 那又回来了。仅仅是因为在列表中。 但是,如果我这样做: 那又回来了。而等于: 为什么? 问题答案: 运算符优先级 2.x,3.x。的优先级低于的优先级。因此,它等效于: 这就是你想要的: 正如@Ben指出的那样:建议从不写作,更喜欢。前者使它看起来像一个函数调用,而它却是一个运算符,而不是一个函数。

  • 本文向大家介绍common-lisp True 和 False,包括了common-lisp True 和 False的使用技巧和注意事项,需要的朋友参考一下 示例 特殊符号T表示Common Lisp中的值true,而特殊符号NIL表示false: 在标准中,它们被称为“常量变量”(sic!),因为它们是无法修改其值的变量。因此,您不能将它们的名称用于普通变量,如以下不正确的示例所示: 实际上,

  • Unicode是ISO-8859-1的超集,因此前256个Unicode字符对应于ISO-8859-1。

  • 问题内容: 使用括号时,这些语句为什么能按预期工作: 但是 ,如果没有括号,它会返回吗? 问题答案: 基于有关操作符优先级的python 文档 : 请注意,比较,成员资格测试和身份测试均具有相同的优先级,并且具有“比较”部分中所述的从左到右的 链接 功能。 因此,实际上您有一个链接语句,如下所示: 您可以假定中心对象将在2个操作和其他对象之间共享(在这种情况下为False)。 并且请注意,对于所有

  • 问题内容: 我试过运行这段代码: 并输出 False 。我认为Python会将任何有价值的东西都视为 True 。为什么会这样呢? 问题答案: 从 6.11开始。 布尔运算: 在布尔运算的上下文中,以及当控制流语句使用表达式时,以下值将解释为false:False,None,所有类型的数字零以及空字符串和容器(包括字符串,元组,列表,字典) ,集合和Frozensets)。所有其他值均解释为tru

  • 为什么当使用括号时,这些语句会像预期的那样工作: 但是当没有括号时,它返回?