gpt4 book ai didi

Java Swing - 导致伪影的半透明组件

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:02:27 25 4
gpt4 key购买 nike

我目前正在为大学类(class)做一个小组项目,但遇到了一些障碍。我们决定实现的程序是一个点对点聊天客户端,带有一个用于存储和共享用户名等的中央服务器。我被分配去做 GUI。

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

这是我的问题所在:

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

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

现在,我发现解决此问题的方法是将窗口拖到看不见的地方(例如最小化或将窗口拖到屏幕外再返回)。

所以,

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

或者,

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

这里有一张图片供引用:

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

最佳答案

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

有了这个,它应该可以工作,而无需像其他答案所建议的那样对所有内容进行任何手动重新绘制。 (我已经这样做过一次。)

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

关于Java Swing - 导致伪影的半透明组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4980246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com