我最近问了一个关于半透明组件因看似未正确更新而导致奇怪的工件的问题。我收到的答案导致伪像消失,但以半透明为代价。
解决方案是 - 对于每个半透明组件 - 也调用 setOpaque(false) 函数。这样,Swing 知道它需要重绘这些组件后面的背景。
然而,这是以我试图实现的半透明为代价的。它导致组件变得透明。
前提是这样的:我正在为一个聊天客户端设计GUI,一个功能要求是有一个背景。我通过遵循扩展 JPanel 类的代码片段成功地使背景正常工作,但随后我希望组件允许显示背景。设置半透明度后,更新组件的剩余部分会显示在不应该显示的位置。我来到这里解决了我的问题,但现在我遇到了一个新问题。所以我们到了。
所以,这就是我的猜测:
-为每个所需的组件调用 setOpaque(false) 函数而不设置半透明颜色并不能达到我想要的效果。
- 设置半透明颜色并且不调用 setOpaque(false) 允许显示半透明背景,但会导致伪像,使我回到第一个方向。
因此,我需要在没有伪影的透明和有伪影的半透明之间找到一些中间立场。也就是说,我想要一个没有伪影的半透明背景(不是完全透明)。
看来我需要重写 JFrame 以使其重新绘制所有组件,无论不透明度如何。除非我错过了什么……这就是我来这里的原因!
Thanks!
(这是原始问题的链接,并附有图片供参考:Java Swing - 导致伪像的半透明组件 https://stackoverflow.com/questions/4980246/java-swing-translucent-components-causing-artifacts)
一种选择是覆盖组件并自己绘制背景:
class TranslucentLabel extends JLabel {
public TranslucentLabel(String text) {
super(text);
setOpaque(false);
}
@Override
public void paintComponent(Graphics g) {
g.setColor(new Color(255, 0, 0, 64));
Insets insets = getInsets();
g.fillRect(insets.left, insets.top,
getWidth() - insets.left - insets.right,
getHeight() - insets.top - insets.bottom);
super.paintComponent(g);
}
}
编辑:或者,您可以将子组件的半透明背景色直接绘制到面板上,然后您不必覆盖组件:
class YourPanel extends JPanel {
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D)g.create();
// Draw your background image here to g2d.
g2d.setColor(new Color(255, 0, 0, 64));
Area area = new Area();
for (Component component : getComponents()) {
area.add(new Area(component.getBounds()));
}
g2d.fill(area);
g2d.dispose();
}
}
这种方法有一个缺点。如果组件有真正透明的部分(例如圆形边框),则其整个背景将被着色。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)