3

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

一位朋友开玩笑地建议我加入“燃烧的背景!” 所以我决定这样做,但要有一个用户选择的背景图像。照原样,只有背景图像的点点滴滴是可见的,所有组件都在它上面,所以我决定尝试实现半透明。

这就是我的问题所在:

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

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

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

所以,

1)有没有办法强制整个窗口像我将它拖离屏幕或最小化它时那样更新?

或者,

2)我一开始做错了吗?如果是这样,我将如何解决它?

这是一张供参考的图片:

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

4

3 回答 3

3

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

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

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

于 2011-02-12T21:23:19.897 回答
0

myComponent.revalidate();
myComponent.repaint();
不确定它是否“强制”重绘,但它会在可能的情况下要求它这样做。

于 2011-02-12T19:57:47.307 回答
0

试试JFrame.repaint()。那应该行得通。如果您想要自定义设计,JFrame那么您将不得不覆盖paint()JFrame 的方法。此外,如果您希望每个组件都是定制设计的,则必须覆盖paint()每个 GUI 组件的方法。需要注意的几点:

  1. 您不必调用paint()任何 GUI 组件。你只需要打电话repaint()
  2. 如果您覆盖其他 GUI 组件 [ JButton, JTextField...],则不必调用它们的repaint()方法。父母Container的 [ JFrame, JPanel...]repaint()将完成这项工作。
于 2011-02-12T20:57:08.627 回答