在jPanel

时间:2016-11-05 19:19:42

标签: java image swing jpanel fade

我希望将图像淡入到作为卡片布局一部分的面板上。当我在程序中的某个位置时,此面板将显示在顶部,然后我希望以淡入效果加载图像。 这是一个很大的项目,所以我只会粘贴相关的代码。

我有一个GUI类,其中包含jFrame,所有jPanel等。当触发某个事件时,此代码运行:

cardMain.show(pMain, "cLeprechaun");
FadeIn.run(pLeprechaun);

它加载正确的面板,然后在FadeIn类中运行一个静态方法,该方法应该将图像添加到面板pLeprechaun上。

这是FadeIn类:

import java.awt.AlphaComposite;
import java.awt.Component;
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 FadeIn extends JPanel implements ActionListener {

    Image imagem;
    Timer timer;
    private float alpha = 0f;

    public FadeIn() {
        imagem = new ImageIcon("darkforest.jpg").getImage();
        timer = new Timer(100, this);
        timer.start();

    }
    // here you define alpha 0f to 1f
    public FadeIn(float alpha) {
        imagem = new ImageIcon("darkforest.jpg").getImage();
        this.alpha = alpha;

    }
    @Override
    public void paintComponent(Graphics g) {
        System.out.println("paint");
        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D) g;

        g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
                                                    alpha));
        g2d.drawImage(imagem, 0, 0, null);

    }

    public static void run(JPanel jPanel) {
        jPanel.add(new FadeIn());  
    }


    public void actionPerformed(ActionEvent e) {
        alpha += 0.05f;
        if (alpha >1) {
            alpha = 1;
            timer.stop();
        }
        repaint();
    }
}

没有任何反应,面板上没有显示图像。只是尝试一下,而不是jPanel.add(new FadeIn());我还尝试创建一个新的jFrame并在其上添加一个新的FadeIn,然后就可以了。当然,不是在jPanel上绘制图像,而是在主视图上弹出一个新的jFrame,图像很好地淡入。但这不是我想要发生的事情。

有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:0)

呃去:

假设您有以下呼叫序列:

JFrame f=new JFrame();
f.setSize(500, 500);
JPanel j=new JPanel();
f.add(j);
f.setVisible(true);
FadeIn.run(j);

您需要更改大小,如下所示:

public FadeIn(Dimension d) {
  setSize(d);
  .... // the rest of set up
}

然后在跑步中:

run(Jpanel jPanel) {
  jPanel.add(new FadeIn(jPanel.getSize()));
}