当前位置: 首页 > 面试题库 >

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

祁高格
2023-03-14
问题内容

我目前正在为一个大学课程从事小组项目,但是遇到了一些绊脚石。我们已决定要实现的程序是一个具有中央服务器的对等聊天客户端,该服务器用于存储和共享用户名等。我已被分配去做GUI。

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

这是我的问题所在:

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

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

现在,我发现解决此问题的方法是将窗口拖到看不见的位置(例如,将窗口最小化或拖动到屏幕外并向后拖动)。

所以,

1)是否有一种方法可以强制整个窗口进行更新,就像我将其从屏幕上拖动或最小化一样?

要么,

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

这是供参考的图片:

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


问题答案:

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

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

编辑:
原因是Swing使用了优化的重绘算法,仅重绘那些确实需要重绘的组件(例如,在某些输入后为JTextField)或在这些组件前面的组件,只要它们是不透明的即可。当需要重涂的组件不是不透明的(=用不透明的颜色填充整个空间)时,也需要重涂组件后面的组件。



 类似资料:
  • 我想创建一个包含透明和半透明部分的图像,这样如果我给,比如说颜色x作为背景,透明部分将显示x颜色,半透明部分将显示颜色x的渐变阴影。 我需要这样一个图像在模板中使用,将由客户谁将有不同的颜色主题使用。 编辑:问题是如何创建既透明 编辑:我让我的问题更清楚了。在附加的图像中,有一个透明区域。想法是在图像中有一个透明区域和一个半透明区域(指向指针的区域,目前这不是半透明的),这样如果我给红色作为bg颜

  • 我想要这样的东西: 我不知道如何实现…任何帮助!

  • 问题内容: 我有一个DIV,我想放置一个图案作为背景。此图案是灰色的。为了使它更好一点,我想在上面放一个透明的颜色“层”。以下是我尝试过的方法,但是没有用。有没有办法将彩色图层放在背景图像上? 这是我的CSS: 问题答案: 这里是: 对此的HTML: 当然,如果其中没有其他元素,则需要为该类定义宽度和高度

  • 我正在尝试为一个学校项目制作我的第一个应用程序。我有时会通过跟随其他人的问题和答案来获得半透明的状态栏,但是导航只是变成灰色,但是没有活动的内容,但是抽屉菜单在状态栏和导航栏下面绘制,我如何使活动也在状态栏和导航栏下面绘制? 在此处输入图像描述 在此处输入图像描述 在onCreate下,图2的代码为: WindowManager。布局参数。旗帜(半透明导航); 我试过使用android:fitsy

  • #klem1,#klem2 { opacity:0.4; filter:alpha(opacity=40); /* For IE8 and earlier */ } #klem1:hover,#klem2:hover { opacity:1.0; filter:alpha(opacity=100); /* For IE8 and earlier */ } div.background { widt

  • 我使用以下布局(main_activity.xml) 具有以下样式-v21 但我仍然无法归档一个透明的状态栏 看起来像这样 但我想要这样的东西(新谷歌报摊App) 注意:我正在使用