• Java小程序—录屏小程序(下半场)


        下半场。

        上半场,我们我们写了录屏的程序,那么下半场我们的任务是写一个播放器。

        设计思路:播放器的思路就是将图片放在一个JScrollPane中顺序播放,所以还是得使用swing组件,并且仍然要使用线程。

    package Frame;
    
    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.awt.Image;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    
    import javax.imageio.ImageIO;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JProgressBar;
    import javax.swing.JScrollPane;
    
    public class Player extends JFrame {
    	File file;
    	JLabel label;
    	JButton play;
    	BufferedImage bufferedImage;
    	JScrollPane jsp;
    
    	JProgressBar loading;// 进度条
    
    	public Player() {
    		setTitle("播放器V1.0");
    		setSize(400, 500);
    		setDefaultCloseOperation(EXIT_ON_CLOSE);
    		setLayout(new BorderLayout());
    
    		loading = new JProgressBar();
    		label = new JLabel();
    		// label.setBackground(Color.BLUE);
    		jsp = new JScrollPane(label);
    		play = new JButton("播放");
    		add(jsp, BorderLayout.CENTER);
    		JPanel jp = new JPanel();
    		jp.setLayout(new FlowLayout());
    		jp.add(play);
    		jp.add(loading);
    		add(jp, BorderLayout.SOUTH);
    
    		play.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				JFileChooser chooser = new JFileChooser();
    				chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
    				int cnt = chooser.showOpenDialog(null);
    				if (cnt == 0) {
    					file = chooser.getSelectedFile();
    					new Play().start();
    				}
    			}
    		});
    		setVisible(true);
    	}
    
    	public class Play extends Thread {
    		public void run() {
    			// 获得文件夹下所有的文件
    			File[] files = file.listFiles();
    			loading.setValue(0);
    			loading.setMaximum(files.length);
    			int index=0;
    			for (File f : files) {
    				try {
    					// 从文件中读取图片到内存中
    					bufferedImage = ImageIO.read(f);
    					Image image = bufferedImage.getScaledInstance(jsp.getWidth(), jsp.getHeight(),Image.SCALE_SMOOTH);// 最后一个参数为平滑渲染
    					ImageIcon icon = new ImageIcon(image);
    					label.setIcon(icon);
    					index++;
    					loading.setValue(index);
    					Thread.sleep(250);
    				} catch (IOException e) {
    					e.printStackTrace();
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    			}
    		}
    	}
    
    	public static void main(String[] args) {
    		new Player();
    	}
    

         上述代码中我们用swing组件做了一个播放器的界面,在播放按钮中添加监听事件,并且在点击的时候弹出一个文件选择器,然后在下面的线程方法中获取用户选择的文件夹路径,然后将获取的文件夹路径的图片读到缓存中,然后用图片缓存技术平滑的展示图片。同时我们在界面中写了一个进度条,进度条的动画是根据图片的剩余张数来显示。

         测试:

          1.运行Recoder.java 点击开始,选择一个文件夹

            

            2.点击保存,10s后点击停止,查看所选文件夹中的文件

            

            3.运行Player.java  点击播放,选择要播放的文件夹路径

            

            4.查看播放效果

              

            总结:

              虽然我们成功的实现了录屏的效果,但是还有很多不足的地方:

                  1.播放的画质特别渣

                  2.播放器中少了暂停和继续播放的功能

                  3.播放器的进度条单一,没有数字提示播放进程

                  4.播放的过程中存在卡顿的效果

                  5. ......

            

  • 相关阅读:
    2018-8-10-win10-uwp-读取保存WriteableBitmap-、BitmapImage
    2018-8-10-win10-uwp-读取保存WriteableBitmap-、BitmapImage
    字节流与字符流的区别详解
    Java线程之 InterruptedException 异常
    java 线程的几种状态
    C++中 引用&与取地址&的区别
    百度富文本编辑器ueditor在jsp中的使用(ssm框架中的应用)
    CodeForces
    CodeForces
    训练记录
  • 原文地址:https://www.cnblogs.com/Black-YeJing/p/9131107.html
Copyright © 2020-2023  润新知