我目前正在为大学课程开展一个小组项目,而且我遇到了一些绊脚石。我们决定实施的程序是一个点对点聊天客户端,它有一个用于存储和共享用户名的中央服务器等。我被指派去做GUI。
一位朋友开玩笑地建议我加入“火红的背景!”所以我决定这样做,但要有一个用户选择的背景图像。按原样,只有背景图像的位和部分可见,所有组件都在其上方,所以我决定尝试实现半透明。
这就是我的问题所在:
当从输入框向聊天窗口发送信息时,或者在浏览好友列表或滚动聊天窗口时,会留下奇怪的瑕疵。这些工件有时是发送按钮的半透明“鬼”,有时是菜单的一部分,或旧文本。在我看来,整个框架没有正确重绘,但我不确定它是如何工作的。
对于实现JTextComponent的组件,我将其选择颜色设置为半透明颜色。对于其他组件,我将背景设置为半透明。我有一个函数,setTranslucency(Component com),它查看一个组件,根据它是什么设置它的半透明,然后查看它是否是某种类型的容器并递归设置每个项目的半透明。
现在,我发现解决此问题的方法是将窗口拖出视线(例如最小化或拖动屏幕外的窗口)。
所以,
1)有没有办法强制整个窗口更新,就像我将其拖离屏幕或最小化一样?
,或者
2)我首先做错了吗?如果是这样,我该如何解决?
以下是参考图片:
答案 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()
方法。有几点需要注意:
paint()
。您只需致电repaint()
。JButton
,JTextField
...],则无需调用其repaint()
方法。家长Container
的[JFrame
,JPanel
...] repaint()
将完成这项工作。