我最近问了一个关于半透明组件的问题,这个问题导致了看起来没有正确更新的奇怪的工件。我收到的答案导致工件消失,但代价是半透明。
解决方案是-对于每个半透明组件-也调用setOpaque(false)函数。这样,Swing就知道它需要重新绘制这些组件背后的背景。
然而,这是以我试图实现的半透明性为代价的。相反,它导致组件变得透明。
前提是:我正在为一个聊天客户端设计GUI,并且一个功能请求需要有一个背景。通过遵循扩展JPanel类的代码片段,我成功地使后台工作,但随后我希望组件允许显示背景。设置其半透明度后,更新组件的残留物将显示在不应该显示的位置。我来这里解决了我的问题,但现在我有了新的问题。所以我们到了这里。
所以,这是我的猜测:
为每个所需的组件设置setOpaque( -Calling )函数,而不设置半透明颜色并不能达到我想要的效果。
-Setting是半透明的颜色,不调用setOpaque(false)允许显示半透明的背景,但会产生伪影,让我回到原点。
因此,我需要一些中间地带,透明的没有人工制品,和半透明的人工制品。也就是说,我想要一个没有瑕疵的半透明背景(不是完全透明的)。
似乎我需要重写JFrame以使其重绘其所有组件,而不考虑不透明度。除非我错过了什么..。这就是我来这里的原因!
谢谢!
(这里有一个指向原始问题的链接,并附图片供参考:Java Swing - Translucent Components causing Artifacts)
发布于 2011-02-13 18:47:56
一种选择是覆盖组件并自己绘制背景:
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();
}
}这种方法有一个缺点。如果一个组件有一个真正透明的部分(比如圆角边框),那么它的整个背景将被着色。
https://stackoverflow.com/questions/4982960
复制相似问题