加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 如何淡入JPanel和儿童?

发布时间:2020-12-15 04:58:50 所属栏目:Java 来源:网络整理
导读:我知道我可以通过在背景颜色和背景颜色中添加alpha值来淡入面板.计时器.但是,我如何淡化具有子组件的面板(如JLabel)? 编辑 _fadeTimer = new Timer(40,new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (_alpha == 255)
我知道我可以通过在背景颜色和背景颜色中添加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();

解决方法

另一个选择是捕获面板的屏幕截图,然后让它自己绘制增加的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,getWidth(),getHeight());
                ((Graphics2D) g).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,alpha));
                g.drawImage(buffer,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();
                }
            }
        });
    }

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读