我目前正在为大学课程进行一个小组项目,但我遇到了一些障碍。我们决定实现的程序是一个点对点聊天客户端,带有一个中央服务器,用于存储和共享用户名等。我被分配负责 GUI。
一位朋友开玩笑地建议我添加“燃烧的背景!”所以我决定这样做,但要有用户选择的背景图像。按原样,只有背景图像的零碎部分可见,所有组件都位于其上方,因此我决定尝试实现半透明。
这就是我的问题所在:
当从输入框发送信息到聊天窗口时,或者在好友列表中导航时,或者滚动聊天窗口时,都会留下奇怪的痕迹。这些工件有时是“发送”按钮的半透明“幽灵”,有时是菜单的一部分或旧文本。在我看来,整个框架没有正确重绘,但我不确定它是如何工作的。
对于实现 JTextComponent 的组件,我将其选择颜色设置为半透明颜色。对于其他组件,我将背景设置为半透明。我有一个函数 setTranslucency(Component com) ,它查看一个组件,根据它的内容设置其半透明度,然后查看它是否是某种容器并递归地设置每个项目的半透明度。
现在,我发现解决此问题的方法是将窗口拖到视线之外(例如最小化窗口或将窗口拖离屏幕并返回)。
So,
1)有没有办法强制整个窗口更新,就像我将它拖出屏幕或最小化它时一样?
or,
2)我一开始就做错了吗?如果是这样,我该如何解决?
这是一张图片供参考:
https://i.stack.imgur.com/4J9GJ.png
您需要告诉 Swing 组件是半透明的,因此它在重新绘制更改的组件时也会绘制背景。为此,您的组件必须返回false
来自isOpaque()
方法(这可以通过setOpaque(false)
当没有子类覆盖时isOpaque
去做别的事)。
有了这个,它应该可以正常工作,而无需对所有内容进行任何手动重新绘制,正如其他答案所提出的那样。 (我已经这样做过一次了。)
Edit:原因是 Swing 使用了优化的重绘算法,只重绘那些真正需要重绘的组件(例如,某些输入后的 JTextField)或这些组件前面的组件,只要它们是不透明的。当需要重新绘制的组件不是不透明的(=用非半透明颜色填充其整个空间)时,也需要重新绘制它们后面的组件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)