我知道我可以通过在背景颜色和背景颜色中添加alpha值来淡入面板。计时器。但是,如何淡化包含子组件的面板(如JLabel
)?
修改
_fadeTimer = new Timer(40, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (_alpha == 255) {
_fadeTimer.stop();
} else {
pnl_hint.setBackground(new Color(
bgColor.getRed(),
bgColor.getGreen(),
bgColor.getBlue(),
(_alpha += 1)));
pnl_hint.updateUI();
}
}
});
_fadeTimer.start();
答案 0 :(得分:6)
另一种选择是捕获面板的屏幕截图,然后让它自己用增加的alpha复合材料进行绘制。
这是一个小演示(尽管我不确定这是否真的很干净):
import java.awt.AlphaComposite;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
public class TestFading {
private static class FadingPanel extends JPanel {
private BufferedImage buffer;
private boolean isFading = false;
private long start;
private float alpha = 1.0f;
@Override
public void paint(Graphics g) {
if (isFading) {// During fading, we prevent child components from being painted
g.clearRect(0, 0, getWidth(), getHeight());
((Graphics2D) g).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
g.drawImage(buffer, 0, 0, this);// We only draw an image of them with an alpha
} else {
super.paint(g);
}
}
public void fade(int time) {
start = System.currentTimeMillis();
buffer = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
this.print(buffer.getGraphics());// Draw the current components on the buffer
isFading = true;
final int timeInMillis = time * 1000;
final Timer t = new Timer(50, null);
t.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
long elapsed = System.currentTimeMillis() - start;
if (elapsed > timeInMillis) {
start = 0;
isFading = false;
buffer = null;
repaint();
t.stop();
} else {
alpha = 1.0f - (float) elapsed / timeInMillis;
repaint();
}
}
});
t.start();
}
}
protected void initUI() throws MalformedURLException {
JFrame frame = new JFrame(TestFading.class.getSimpleName());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final FadingPanel panel = new FadingPanel();
JTextField textfield = new JTextField(60);
JLabel image = new JLabel(new ImageIcon(new URL("http://helios.gsfc.nasa.gov/image_mag_stamp.jpg")));
JButton button = new JButton("Fade");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// I use an invoke later to allow the button to release itself
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
panel.fade(5);// Fade the panel in 5s.
}
});
}
});
panel.add(textfield);
panel.add(image);
panel.add(button);
frame.add(panel);
frame.setSize(400, 300);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
new TestFading().initUI();
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
});
}
}
答案 1 :(得分:3)
未经测试的伪代码。
public void fade(Container c) {
Component[] children = c.getComponents();
for (Component component : components) {
// do fade thing with component
if (component instanceOf Container) {
fade( (Container)component );
}
}
}
答案 2 :(得分:3)
而不是设置后台覆盖paintChildren
方法。调用super.paintChildren()
然后用半透明颜色填充组件的rect。
答案 3 :(得分:0)
我添加了一个带有图像的JLabel,并将JPanel opaque设置为false!
在覆盖paintComponent方法中,我在super.paintComponent()调用之前使用我的alpha设置AlphaComposite。