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

时间:2011-02-12 19:52:23

标签: java user-interface swing transparency translucency

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

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

这就是我的问题所在:

当从输入框向聊天窗口发送信息时,或者在浏览好友列表或滚动聊天窗口时,会留下奇怪的瑕疵。这些工件有时是发送按钮的半透明“鬼”,有时是菜单的一部分,或旧文本。在我看来,整个框架没有正确重绘,但我不确定它是如何工作的。

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

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

所以,

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

,或者

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

以下是参考图片:

http://i.stack.imgur.com/4J9GJ.png

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

  1. 您无需为任何GUI组件调用paint()。您只需致电repaint()
  2. 如果您覆盖其他GUI组件[JButtonJTextField ...],则无需调用其repaint()方法。家长Container的[JFrameJPanel ...] repaint()将完成这项工作。