切换到cardlayout中的动画图像

时间:2015-09-16 13:00:57

标签: java swing animation

我想创建一个登录对话框。当用户按下登录按钮时,它将显示动画图像。通过一些搜索,我发现使用cardlayout可以切换到另一个面板,所以我为我的登录对话框选择了cardlayout。但是当切换到面板包含一个jlabel时,动画图像jlabel只是加载文本 这是我的代码:

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * @author 20133_000
 */
public class Draft9 {

    public static void main(String[] args) {
        TestCardLayout test = new TestCardLayout();

    }
}

class TestCardLayout extends JFrame {

    private JPanel mainPanel;
    private CardPanel panel1;
    private JPanel panel2;
    private CardLayout layout;

    public TestCardLayout() {
        mainPanel = new JPanel();
        panel1 = new CardPanel();
        panel2 = new JPanel();
        layout = new CardLayout();
        panel1.add(new JButton("here is panel 1")); 
        JLabel jLabel1 = new javax.swing.JLabel("here is panel 2",new javax.swing.ImageIcon( "E:\\programming\\programming java\\Netbean Projectr\\Project1\\src\\images\\loading3.gif") , JLabel.CENTER);
        jLabel1.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        //jLabel1.setIcon(new javax.swing.ImageIcon("/images/loading3.gif")); // NOI18N
       // jLabel1.setIcon(new javax.swing.ImageIcon("E:\\programming\\programming java\\Netbean Projectr\\Project1\\src\\images\\loading3.gif"));
        panel2.add(new JButton("here is panel 2"), BorderLayout.NORTH);
        panel2.add(jLabel1, BorderLayout.CENTER);
        mainPanel.setLayout(layout);
        mainPanel.add("panel1", panel1);
        mainPanel.add("panel2", panel2);
        add(mainPanel, BorderLayout.CENTER);
        setSize(400, 450);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        //layout.show(mainPanel, "panel2");
    }
}

class CardPanel extends JPanel {
    JButton btnChangePanel;
    public CardPanel() {
        btnChangePanel = new JButton("show panel 2");
        btnChangePanel.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                showPanel2();
                calculateData();
            }
        });
        add(btnChangePanel);
    }

    public void showPanel2() {
        JPanel parentPanel = (JPanel) getParent();
        CardLayout layout = (CardLayout) parentPanel.getLayout();
        layout.show(parentPanel, "panel2");
    }

     public void showPanel1() {
        JPanel parentPanel = (JPanel) getParent();
        CardLayout layout = (CardLayout) parentPanel.getLayout();
        layout.show(parentPanel, "panel1");
    }   

    public void calculateData() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println("calculating data...");
                    //doing some calculate here
                    Thread.sleep(3000);
                    System.out.println("done calculting");
                    //System.exit(0);
                    int res = 1;
                    if (res == 1) {
                        System.out.print("login ok");
                        showPanel2();
                    } else {
                        System.out.print("login failed");
                        showPanel1();
                    }
                } catch (Exception ex) {
                    Logger.getLogger(CardPanel.class.getName()).log(Level.SEVERE, null, ex);
                }
            }

        });

    }
}

当我离开 Thread.sleep(3000); 评论它有效但当我取消注释该行时它不起作用。我该如何解决?

1 个答案:

答案 0 :(得分:1)

这是因为您的图像是动画的(可以使用普通图像)并且您的Thread.sleep(3000)会冻结整个帧,请注意您也无法单击按钮(或移动框架)。你可以开始一个新线程来解决这个问题:

public void calculateData() {

    new Thread(new Runnable() {
        public void run() {
            try {
                System.out.println("calculating data...");
                // doing some calculate here
                Thread.sleep(3000);
                System.out.println("done calculting");
                // System.exit(0);
                int res = 1;
                if (res == 1) {
                    System.out.print("login ok");
                    showPanel2();
                } else {
                    System.out.print("login failed");
                    showPanel1();
                }
            } catch (Exception ex) {
                Logger.getLogger(CardPanel.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }).start();

}