java - 为什么此计时器中的 alpha 在此 Java Swing 面板中绘制在其自身之上?
问题描述
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
public class Main {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setLayout(new FlowLayout());
frame.setSize(new Dimension(100, 100));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
TestPanel panel = new TestPanel();
panel.setPreferredSize(new Dimension(50,50));
frame.add(panel);
frame.setVisible(true);
}
static class TestPanel extends JPanel implements ActionListener{
private static final long serialVersionUID = 8518959671689548069L;
public TestPanel() {
super();
Timer t = new Timer(1000, this);
t.setRepeats(true);
t.start();
}
int opacity = 10;
@Override
public void actionPerformed(ActionEvent e) {
if(opacity >= 250) {
opacity = 0;
}
else {
this.setBackground(new Color(255, 212, 100, opacity));
this.repaint();
opacity+=10;
System.out.println("opacity is " + opacity);
}
}
}
}
alpha 变化的速度比它应该的要快。达到某一点后,不透明度下降,而控制台中打印的不透明度小于 250。调整窗口大小“重置”它,使 alpha 正确。
我如何让它真正正确地绘制阿尔法?
解决方案
this.setBackground(new Color(255, 212, 100, opacity));
Swing 不支持透明背景。
Swing 期望一个组件是:
- opaque - 这意味着组件将在进行自定义绘制之前首先使用不透明颜色重新绘制整个背景,或者
- 完全透明 - 在这种情况下,Swing 将首先绘制第一个不透明父组件的背景,然后再进行自定义绘制。
该setOpaque(...)
方法用于控制组件的 opaque 属性。
在任何一种情况下,这都可以确保删除任何绘画工件,并且可以正确完成自定义绘画。
如果要使用透明度,则需要自己进行自定义绘画以确保清除背景。
面板的自定义绘画将是:
JPanel panel = new JPanel()
{
protected void paintComponent(Graphics g)
{
g.setColor( getBackground() );
g.fillRect(0, 0, getWidth(), getHeight());
super.paintComponent(g);
}
};
panel.setOpaque(false); // background of parent will be painted first
每个使用透明度的组件都需要类似的代码。
或者,您可以查看具有透明度的背景以获取自定义类,该类可用于为您完成上述工作的任何组件。
推荐阅读
- typescript - forEach 循环中设置的变量类型错误
- html - 如何在智能手机的小屏幕上垂直或横向制作响应式导航堆栈(使用 Bootstrap 4 alpha 2)?
- python - 如何使用 QtWidgets 将 PyQtGraph 添加到 QMainWindow?
- python - 现场未找到 XPATH
- kubernetes - 无法运行 Kops 模板
- android - Mapbox SDK for android 安装不正确
- sql - SQL DATETIMEOFFSET (Eventdatetime) - 从字符串转换日期和/或时间时转换失败
- c++ - WinAPI/MFC 用户自定义函数
- markdown - Github 风格的降价:不解读 emojis?
- python - 在 try/catch 块中重新排列声明