java jtextfield 透明_具有透明文本字段的Java Nimbus LAF

我有一个应用程序在几个地方使用禁用的JTextFields,这些地方是透明的 – 允许背景显示,而不是文本字段的正常背景.

当运行新的Nimbus LAF时,这些字段是不透明的(尽管设置了setOpaque(false)),并且我的UI被破坏.就好像LAF忽略了不透明的属性.明确设置背景颜色在几个地方都是困难的,由于背景图片实际上不太适合 – 它仍然表现为顶部的LAF默认背景,留下了边框样的外观(下面的启动画面已经有背景明确设置为匹配图像).

任何关于如何让Nimbus不为JTextField绘制背景的想法?

注意:我需要一个JTextField,而不是一个JLabel,因为我需要线程安全的setText()和包装功能.

注意:我的后备位置是继续使用系统LAF,但Nimbus看起来更好看.

参见下面的示例图.

结论

在这种行为上的惊喜是由于对SetOpaque()打算做的事情的误解 – 来自Nimbus的错误报告:

This is a problem the the orginal design of Swing and how it has been confusing for years. The issue is setOpaque(false) has had a side effect in exiting LAFs which is that of hiding the background which is not really what it is ment for. It is ment to say that the component my have transparent parts and swing should paint the parent component behind it.

不幸的是,Nimbus组件也似乎不符合setBackground(null),否则这将是推荐的停止背景绘画的方法.设置一个完全透明的背景似乎是不直观的.

在我看来,setOpaque()/ isOpaque()是一个错误的公共API选择,应该只有:

public boolean isFullyOpaque();

我说这个,因为isOpaque()== true是与Swing的合同,组件子类将负责绘制它的整个背景 – 这意味着父代可以跳过绘制该区域(这是一个重要的性能增强).外部事务不能直接改变合同(合法),其履行可以被编码到组件中.

所以组件的不透明度不应该使用setOpaque()来设置.相反,像setBackground(null)这样的东西应该会导致许多组件“不具有背景”,因此变得不完全不透明.举个例子,在理想的世界中,大多数组件应该有一个如下所示的isOpaque():

public boolean isOpaque() { return (background!=null); }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值