Java Swing – 造成工件的半透明组件

我目前正在为大学课程开展一个小组项目,而且我遇到了一些绊脚石。 我们决定实施的程序是一个点对点聊天客户端,它有一个用于存储和共享用户名等的中央服务器。我被分配到GUI。

一位朋友开玩笑地建议我加入“火红的背景!” 所以我决定这样做,但要有一个用户选择的背景图像。 按原样,只有背景图像的一些部分可见,所有组件都在其上方,因此我决定尝试实现半透明效果。

这就是我的问题所在:

当从输入框向聊天窗口发送信息,或者在导航朋友列表或滚动聊天窗口时,遗留了奇怪的伪像。 这些工件有时是发送按钮的半透明“鬼”,有时是菜单的一部分,或旧文本。 它看起来像整个框架没有正确重绘,但我不知道它是如何工作的。

对于实现JTextComponent的组件,我将其选择颜色设置为半透明颜色。 对于其他组件,我将背景设置为半透明。 我有一个函数,setTranslucency(组件com),它查看一个组件,根据它是什么设置它的半透明,然后看它是否是某种类型的容器并递归设置每个项目的半透明度。

现在,我发现解决这个问题的方法是将窗口拖出视线(例如最小化或拖动屏幕外的窗口)。

所以,

1)是否有办法强制整个窗口更新,就像我将其拖离屏幕或最小化时一样?

要么,

2)我首先做错了吗? 如果是这样,我该如何解决?

这是一张参考图片:

http://sofzh.miximages.com/java/4J9GJ.png

您需要告诉Swing组件是半透明的,因此在重新绘制更改的组件时它也会绘制背景。 为此,您的组件必须从isOpaque()方法返回false setOpaque(false)当没有子类覆盖isOpaque来执行其他操作时,可以通过setOpaque(false)实现)。

有了它,它应该在没有任何手动重新绘制所有内容的情况下工作,正如其他答案所提出的那样。 (我已经做了一次。)

编辑:原因是Swing使用优化的重绘算法,只重新绘制真正需要重新绘制的组件(例如,一些输入后的JTextField)或这些组件前面的组件,只要它们是不透明的。 当需要重新绘制的组件不是不透明的(=用非半透明颜色填充其整个空间)时,还需要重新绘制它们背后的组件。

myComponent.revalidate();
myComponent.repaint();
不确定它是否“强制”重绘,但它要求它尽可能地执行。

试试JFrame.repaint() 。 这应该工作。 如果你想自定义JFrame设计,那么你必须覆盖JFrame的paint()方法。 此外,如果您希望每个组件都是自定义设计的,则必须覆盖每个GUI组件的paint()方法。 有几点要注意:

  1. 您不必为任何GUI组件调用paint() 。 你只需要调用repaint()
  2. 如果你覆盖其他GUI组件[ JButtonJTextField …],你不必调用他们的repaint()方法。 父Container的[ JFrameJPanel …] repaint()将完成这项工作。