Java 如何使3个图像在JPanel中淡入淡出?

Java 如何使3个图像在JPanel中淡入淡出?,java,swing,jpanel,fade,Java,Swing,Jpanel,Fade,我的问题是如何让第一个图像消失,然后第二个图像消失,然后第三个图像消失。我试着到处改变,但没有效果。这一切马上就出来了。有人能告诉我该改哪一部分吗 import java.awt.AlphaComposite; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.even

我的问题是如何让第一个图像消失,然后第二个图像消失,然后第三个图像消失。我试着到处改变,但没有效果。这一切马上就出来了。有人能告诉我该改哪一部分吗

  import java.awt.AlphaComposite;
  import java.awt.Graphics;
  import java.awt.Graphics2D;
  import java.awt.Image;
  import java.awt.event.ActionEvent;
  import java.awt.event.ActionListener;
  import javax.swing.ImageIcon;
  import javax.swing.JFrame;
  import javax.swing.JPanel;
  import javax.swing.Timer;

  public class FadeOutImage2 extends JPanel implements ActionListener{

  Image myImage = new ImageIcon("C:\\Users\\NUR\\Pictures\\FLOWER1.jpg").getImage();
  Image myImage2 = new ImageIcon("C:\\Users\\NUR\\Pictures\\FLOWER2.jpg").getImage();
  Image myImage3 = new ImageIcon("C:\\Users\\NUR\\Pictures\\FLOWER3.jpg").getImage();

  Timer timer = new Timer (50, this); //setting time to fade
  private float alpha = 1f; //alpha value on channel

  public FadeOutImage2(){
     timer.start();
  }

  public void paint(Graphics g){
     super.paint(g);

     Graphics2D g2d = (Graphics2D)g;
     Graphics2D g2d2 = (Graphics2D)g;
     Graphics2D g2d3 = (Graphics2D)g;


g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,alpha));  
g2d2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,alpha));
g2d3.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,alpha));

g2d.drawImage(myImage, 10,10, null); //coordinate
g2d2.drawImage(myImage2, 10,10, null);
g2d3.drawImage(myImage3, 10,10, null);
   }

  public void actionPerformed(ActionEvent e){
      alpha += -0.01f;
      if(alpha<=0){
         alpha=0;
         timer.stop();}

      repaint();
  }

public static void main(String[] args){
     JFrame frame = new JFrame("Fade Out");
     frame.add(new FadeOutImage2());

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     frame.setSize(1500,1500);
     frame.setVisible(true);
 }
 }
导入java.awt.AlphaComposite;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Image;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.ImageIcon;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.Timer;
公共类FadeOutImage2扩展了JPanel实现ActionListener{
Image myImage=newimageicon(“C:\\Users\\NUR\\Pictures\\FLOWER1.jpg”).getImage();
Image myImage2=新图像图标(“C:\\Users\\NUR\\Pictures\\FLOWER2.jpg”).getImage();
Image myImage3=新图像图标(“C:\\Users\\NUR\\Pictures\\FLOWER3.jpg”).getImage();
定时器=新定时器(50,这个);//设置淡入淡出的时间
专用浮点alpha=1f;//通道上的alpha值
公共淡出2(){
timer.start();
}
公共空间涂料(图g){
超级油漆(g);
Graphics2D g2d=(Graphics2D)g;
Graphics2D g2d2=(Graphics2D)g;
图形2d g2d3=(图形2d)g;
setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,alpha));
setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,alpha));
setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,alpha));
g2d.drawImage(myImage,10,10,null);//坐标
g2d2.drawImage(myImage2,10,10,null);
g2d3.drawImage(myImage3,10,10,null);
}
已执行的公共无效操作(操作事件e){
α+=-0.01f;
如果(字母理论。。。
好的,根据你的要求,我的第一个建议是把重点放在淡入淡出一个图像上。如果你能理解如何做到这一点,那么淡入淡出三个图像(一个接一个)就简单多了

动画是一种随时间变化的幻觉。因此,您首先需要某种方法在一段时间内改变
alpha
的状态。因为Swing是单线程的,并且不是线程安全的,这就给您留下了一个基本选择,Swing
计时器

这将定期生成更新,这些更新是事件调度线程上下文中的触发器,可以安全地与Swing一起使用并从内部更新UI

由于硬件(和操作系统)的差异,我会避免固定速率衰减(即,对
alpha
应用固定的
delta
,然后重复,直到达到
目标为止)。这种方法可能会在不同的系统上产生不期望的结果

根据我的经验,基于时间的解决方案通常会产生更一致的结果。基于时间的方法表示动画将在指定的时间段内运行,在
计时器的每一个滴答声上,我们计算进度量并将其应用于我们的状态(我们知道我们需要从0-1开始淡入图像,因此很容易根据进度计算状态)

基本实现。。。 这听起来都是在实践中找到的,但我们如何实际应用它。因为解决方案并不总是简单的,我会专注于创建一个专用类来执行操作

public class FadePane extends JPanel {
    
    private BufferedImage source;
    private Timer timer;
    
    private float alpha = 1.0f;
    
    private int duration = 2000; // 2 seconds
    private Long startTime;
    
    private boolean fadeOut = false;
    
    private FadeListener fadeListener;
    
    public FadePane(BufferedImage source) {
        this.source = source;
        timer = new Timer(5, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (startTime == null) {
                    startTime = System.currentTimeMillis();
                    fadeStarted();
                }
                long diff = System.currentTimeMillis() - startTime;
                alpha = (float)diff / (float)duration;
                if (alpha > 1.0) {
                    timer.stop();
                    alpha = 1.0f;
                    fadeCompleted();
                }
                if (fadeOut) {
                    alpha = 1.0f - alpha;
                }
                repaint();
            }
        });
    }
    
    public void setFadeListener(FadeListener listener) {
        fadeListener = listener;
    }

    public boolean isFadeOut() {
        return fadeOut;
    }
    
    protected void fadeStarted() {
        if (fadeListener != null) {
            fadeListener.fadeStarted(this);
        }
    }

    protected void fadeCompleted() {
        if (fadeListener != null) {
            fadeListener.fadeCompleted(this);
        }
    }
    
    public void setSource(BufferedImage img) {
        source = img;
    }
    
    public void reset() {
        timer.stop();
        alpha = 0;
        startTime = null;
    }
    
    public void fadeIn() {
        reset();
        fadeOut = false;
        timer.start();
    }
    
    public void fadeOut() {
        reset();
        fadeOut = true;
        timer.start();
    }
    
    @Override
    public Dimension getPreferredSize() {
        return source == null ? new Dimension(200, 200) : new Dimension(source.getWidth(), source.getHeight());
    }
    
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g.create();
        g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
        int x = (getWidth() - source.getWidth()) / 2;
        int y = (getHeight() - source.getHeight()) / 2;
        g2d.drawImage(source, x, y, this);
        g2d.dispose();
    }
    
}
FadePane
会获取一张
源图像,根据您调用的方法,它会在2秒内淡入淡出

您只需通过
setSource
方法更改
source
图像并淡入或淡出新图像,即可重复使用
FadePane
,具体取决于所需的结果

淡入淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡

public interface FadeListener {
    public void fadeStarted(FadePane pane);
    public void fadeCompleted(FadePane pane);
}
这可用于更改UI的状态(禁用/启用功能)以及在需要时切换图像

可运行的示例。。。 此示例允许用户淡入淡出相同的图像,但通过淡入淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡出淡

你是说像和
import java.awt.AlphaComposite;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
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.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                        ex.printStackTrace();
                    }

                    BufferedImage source = ImageIO.read(...);
                    FadePane fadePane = new FadePane(source);
                    JButton btn = new JButton("Fade");
                    btn.addActionListener(new ActionListener() {
                        private boolean fadeOut = true;
                        @Override
                        public void actionPerformed(ActionEvent e) {
                            if (fadeOut) {
                                fadePane.fadeOut();
                            } else {
                                fadePane.fadeIn();
                            }
                            fadeOut = !fadeOut;
                        }
                    });

                    fadePane.setFadeListener(new FadeListener() {
                        @Override
                        public void fadeStarted(FadePane pane) {
                            btn.setEnabled(false);
                        }

                        @Override
                        public void fadeCompleted(FadePane pane) {
                            // Set next image and start the
                            // fade process again
                            btn.setEnabled(true);
                        }
                    });

                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(fadePane);
                    frame.add(btn, BorderLayout.SOUTH);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        });
    }

    public interface FadeListener {
        public void fadeStarted(FadePane pane);
        public void fadeCompleted(FadePane pane);
    }

    public class FadePane extends JPanel {

        private BufferedImage source;
        private Timer timer;

        private float alpha = 1.0f;

        private int duration = 2000; // 2 seconds
        private Long startTime;

        private boolean fadeOut = false;

        private FadeListener fadeListener;

        public FadePane(BufferedImage source) {
            this.source = source;
            timer = new Timer(5, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (startTime == null) {
                        startTime = System.currentTimeMillis();
                        fadeStarted();
                    }
                    long diff = System.currentTimeMillis() - startTime;
                    alpha = (float)diff / (float)duration;
                    if (alpha > 1.0) {
                        timer.stop();
                        alpha = 1.0f;
                        fadeCompleted();
                    }
                    if (fadeOut) {
                        alpha = 1.0f - alpha;
                    }
                    repaint();
                }
            });
        }

        public void setFadeListener(FadeListener listener) {
            fadeListener = listener;
        }

        protected void fadeStarted() {
            if (fadeListener != null) {
                fadeListener.fadeStarted(this);
            }
        }

        protected void fadeCompleted() {
            if (fadeListener != null) {
                fadeListener.fadeCompleted(this);
            }
        }

        public void setSource(BufferedImage img) {
            source = img;
        }

        public void reset() {
            timer.stop();
            alpha = 0;
            startTime = null;
        }

        public boolean isFadeOut() {
            return fadeOut;
        }

        public void fadeIn() {
            reset();
            fadeOut = false;
            timer.start();
        }

        public void fadeOut() {
            reset();
            fadeOut = true;
            timer.start();
        }

        @Override
        public Dimension getPreferredSize() {
            return source == null ? new Dimension(200, 200) : new Dimension(source.getWidth(), source.getHeight());
        }

        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
            int x = (getWidth() - source.getWidth()) / 2;
            int y = (getHeight() - source.getHeight()) / 2;
            g2d.drawImage(source, x, y, this);
            g2d.dispose();
        }

    }

}