有两个问题需要注意
paintComponent
方法,使用AlphaComposite
填充它,否则Swing会认为你的组件应该被绘制在其他组件上面而导致更多绘制问题。TranslucentPanel
中,你允许组件绘制背景,并再次用一个半透明版本来填充它,导致重复。你需要将这个组件设置为透明的。我建议首先修改TranslucentPane
,以便您可以控制透明度级别,例如:
public class TranslucentPane extends JPanel {
private float alpha = 1f;
public TranslucentPane() {
}
public void setAlpha(float value) {
if (alpha != value) {
alpha = Math.min(Math.max(0f, value), 1f);
setOpaque(alpha == 1.0f);
repaint();
}
}
public float getAlpha() {
return alpha
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setComposite(AlphaComposite.SrcOver.derive(getAlpha()));
g2d.setColor(getBackground());
g2d.fillRect(0, 0, getWidth(), getHeight());
g2d.dispose();
}
}
panel_Bottom
的使用进行更改...private TranslucentPane panel_Bottom;
//...
panel_Bottom = new TranslucentPane();
panel_Bottom.setBorder(new LineBorder(new Color(0, 0, 0)));
if(isTransparent){
panel_Bottom.setAlpha(0.85f);
}
我强烈建议您停止使用null
布局,并学习如何使用适当的布局管理器,它们将使您的生活更简单。
请参阅在容器内布置组件了解更多详情。
setOpaque(alpha == 1.0f);
而不是setOpaque(alpha != 1.0f);
- 星期一早上:P - MadProgrammersetOpaque
)之前,您无法使用基于 alpha 的颜色来处理 Swing 组件,但是然后您需要覆盖它们的paintComponent
方法,以确保它们实际上仍在绘制它们的背景。 - MadProgrammer