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正确。
如何使其正确绘制Alpha?
this.setBackground(new Color(255, 212, 100, opacity));
摇摆不支持透明背景。
Swing希望组件为:
该setOpaque(...)方法用于控制组件的不透明属性。
setOpaque(...)
在任何一种情况下,这都可以确保除去所有绘画瑕疵,并且可以正确完成自定义绘画。
如果要使用透明度,则需要对自己进行自定义绘制以确保清除背景。
面板的自定义绘画为:
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
使用透明性的每个组件都需要类似的代码。
或者,您可以签出自定义类的Background With Transparency,该自定义类可以在将为您完成上述工作的任何组件上使用。