Java中使用Timer 這個類來完成Swing的動畫效果。

在網上找了好久都沒有找到包含整個源代碼的Swing動畫,特別是淡入淡出效果,現在先上傳個簡單的動畫供大家參考
package com.sbt.common.client.utils;


import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;


/**
 *  演示如何使用Timer 這個類來完成Swing的動畫效果。
 * @author zcl
 */
public class TestWindow extends JPanel {


    private final int panelWidth = 300, panelHeight = 200;
    private final int DELAY = 10, IMAGE_SIZE = 35;
    private Timer timer;
    private JButton topButton;
    private int x, y, moveX, moveY;


    /**
     * 面板構造函數,初始化面板。包括Timer 的場景。
     */
    public TestWindow() {
        timer = new Timer(DELAY, new ReboundListener());
        this.setLayout(new FlowLayout(FlowLayout.LEFT));
        topButton = new JButton("top");   	
//        topButton.setPreferredSize(new Dimension(20, 20));


        x = 0;
        y = 40;
        moveX = moveY = 3;
        setBackground(Color.WHITE);
        this.setBorder(BorderFactory.createLineBorder(Color.GREEN));
        JButton button  = new JButton("click");
        button.addMouseListener(getClickListener());
        this.add(button);
    }
    
    private AsynMouseEventListener clickListener;
    private AsynMouseEventListener getClickListener(){
    	if(clickListener == null){
    		clickListener = new AsynMouseEventListener() {
				@Override
				public boolean prepareAction(MouseEvent e){
					if(e.getButton() == MouseEvent.BUTTON1){
						timer.start();
					}else{
						timer.stop();
					}
					return false;
				}
    		};
    	}
    	return clickListener;
    }
    /**
     *  繪出圖像在面板中的位置。
     * @param page
     */
    @Override
    public void paintComponent(Graphics page) {
        super.paintComponent(page);
        topButton.paint(page);
    }


    //Swing 動畫,不斷的更新圖像的位置,已達到動畫的效果。
    private class ReboundListener implements ActionListener {
        @Override
		public void actionPerformed(ActionEvent e) {
            x += moveX;
            y += moveY;
            topButton.setBounds(0, 0, 100, y);
            if (x <= 0 || x >= panelWidth - IMAGE_SIZE) {
             moveX = moveX * (-1);
            }
            if (y <= 0 || y >= panelHeight - IMAGE_SIZE) {
             moveY = moveY * (-1);
//            	moveY =0;
            }
            repaint();
        }
    }


    public static void main(String[] args) {
        JFrame frame = new JFrame("JUST SOSO");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new TestWindow());
        frame.setSize(300, 300);
        frame.setLocation(400, 400);
        frame.setVisible(true);
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章