天天看點

JFileChooser實作對標明檔案夾内圖檔自動播放

本案例通過使用JFileChooser實作對標明檔案夾内圖檔實作自動播放和暫停播放

代碼如下,如有不合适的地方 還請指教

package com.xiaoqiang;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;

import java.util.Timer;
import java.util.TimerTask;
/**
 *  本例通過JFileChooser選擇檔案夾 
 *  對檔案夾内圖檔進行滾動播放 用到TimerTask以及ActionListener
 *  詳細解釋JFileChooser使用及圖檔滾動過程需要的思維
 * @author xiaoqiang
 * @timer 2017年4月27日    
 */
public class PlayPicture extends JFrame implements ActionListener{
    private  File fileDirectory;
    private JFileChooser fileChooser;
    private Container con;
    private JButton nextPic;
    private JButton previousPic;
    private JButton showPic;
    private JButton beginPlayPic;
    private JButton stopPlayPic;
    private JLabel picIcon;
    private String[] fileName;
    private String parentPath;
    private static boolean play;
    private static PlayPicture playPicture;
    private int i=-1;
    private PlayPicture(){
        super("圖檔自動播放器");
        this.draw();
    }
    /**
     * 擷取單例類 
     * 用于TimerTask執行時調用同一對象
     * @return Object
     */
    public static Object getInstance(){
        if(playPicture==null)
            playPicture=new PlayPicture();
        return playPicture;
    }
    /**
     * 畫圖方法 将GUI畫出來
     * 因為練習圖檔滾動和JFileChooser
     * 是以GUI比較難看
     */
    public void draw(){
        con=this.getContentPane();
        con.setLayout(new FlowLayout());
        showPic=new JButton("請選擇目錄");
        con.add(showPic);
        showPic.addActionListener(this);
        picIcon=new JLabel("請選擇目錄展示圖檔");
        con.add(picIcon);
        previousPic=new JButton("上一張");
        con.add(previousPic);
        previousPic.addActionListener(this);
        nextPic=new JButton("下一張");
        con.add(nextPic);
        nextPic.addActionListener(this);
        beginPlayPic=new JButton("開始自動播放");
        stopPlayPic=new  JButton("停止自動播放");
        con.add(beginPlayPic);
        con.add(stopPlayPic);
        beginPlayPic.addActionListener(this);
        stopPlayPic.addActionListener(this);
        this.setLocation(550, 200);
        this.setSize(900,700);
        this.setVisible(true);

    }
    /**
     * 執行自動播放效果 
     * 注意使用的單例類
     * 暫停的話設定單例類靜态變量
     * play為false
     */
    public void automatic(){

        TimerTask task = new TimerTask() {  
            @Override  
            public void run() {
                ((PlayPicture) PlayPicture.getInstance()).NextPicture();
                if(!((PlayPicture)PlayPicture.getInstance()).play){
                    ((PlayPicture) PlayPicture.getInstance()).previousPicture();
                }
            } 
        };  
        Timer timer = new Timer();  
        long delay = 0;  
        //intevalPeriod為秒數
        long intevalPeriod = 5 * 1000;  
        timer.scheduleAtFixedRate(task, delay, intevalPeriod);
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource().equals(showPic)){
            //設定G盤為預設打開路徑
            i=-1;//每次打開都将i重置 友善播放檔案
            fileChooser=new JFileChooser(new File("G:"));
            /*
             * 設定可以選擇檔案夾,預設為隻允許選擇檔案
             * 
             *  DIRECTORIES_ONLY 訓示僅顯示目錄。
             *  FILES_AND_DIRECTORIES 訓示顯示檔案和目錄
             *  FILES_ONLY 訓示僅顯示檔案。(預設)
             * 
             */
            fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
            //把JFileChooser釋放
            int returnVal =fileChooser.showOpenDialog(this);
            switch (returnVal) {
            case JFileChooser.APPROVE_OPTION:
                fileDirectory=fileChooser.getSelectedFile();

                parentPath=fileDirectory.getAbsolutePath();
                fileName=fileDirectory.list();
                if(hasPicture()){
                    this.NextPicture();
                    setBottonEnabled(true);
                }else{
                    picIcon.setText("該目錄沒有圖檔哦");
                    picIcon.setIcon(null);
                    setBottonEnabled(false);
                }
                break;
            case JFileChooser.CANCEL_OPTION :
                picIcon.setText("你取消的選擇檔案");
                picIcon.setIcon(null);
                setBottonEnabled(false);
                break;
            default:
                picIcon.setText("由于錯誤操作導緻意外發生");
                picIcon.setIcon(null);
                setBottonEnabled(false);
                break;
            }
        }else if(e.getSource().equals(nextPic)){
            this.NextPicture();
        }else if(e.getSource().equals(previousPic)){
            this.previousPicture();
        }else if(e.getSource().equals(beginPlayPic)){
            this.automatic();
            play=true;
        }else if(e.getSource().equals(stopPlayPic)){
            play=false;
        }

    }
    //設定按鈕不可用
    private void setBottonEnabled(boolean available){
        nextPic.setEnabled(available);
        previousPic.setEnabled(available);
        beginPlayPic.setEnabled(available);
        stopPlayPic.setEnabled(available);
    }
    //判斷所選路徑是否有圖檔
    private boolean hasPicture(){
        for(String s:fileName){
            if(s.matches("(?i).*(.jpg|.png|.gif|.bpm|.jpeg)$"))
                return true;
        }
        return false;
    }
    private void previousPicture(){
        if(i==0){
            i=fileName.length-1;

        }
        while(!fileName[--i].matches("(?i).*(.jpg|.png|.gif|.bpm|.jpeg)$")){
            if(i==-1){
                i=fileName.length;

            }
        }
        System.out.println(i);
        picIcon.setIcon(new ImageIcon(parentPath+"\\"+fileName[i]));
        picIcon.setText("");
    }
    private void NextPicture() {
        if(i==fileName.length-1){
            i=0;
        }
        while(!fileName[++i].matches("(?i).*(.jpg|.png|.gif|.bpm|.jpeg)$")){
            if(i==fileName.length-1){
                i=-1;
            }
        }
        System.out.println(i);
        picIcon.setIcon(new ImageIcon(parentPath+"\\"+fileName[i]));
        picIcon.setText("");
    }
    public static void main(String[] args) {
        //擷取執行個體調用構造方法
        PlayPicture.getInstance();
    }
}