下半场。

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

设计思路:播放器的思路就是将图片放在一个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. ......

Java小程序—录屏小程序(下半场)的更多相关文章

  1. Java小程序—录屏小程序(上半场)

    做软件的三个步骤: (1)做什么? (2)怎么做? (3)动手做! ok,我们今天要做的是一个录屏软件,那怎么做呢?首先,我们小时候都玩过一种小人书,就是当你快速翻动书页时,书中的人物就会活灵活现的动 ...

  2. 再见,付费录屏软件!我用70行Python代码打造免费版!

  3. appium+java(五)微信小程序自动化测试实践

    前言: 上一篇<appium+java(四)微信公众号自动化测试实践>中,尝试使用appium实现微信公众号自动化测试,接着尝试小程序自动化,以学院小程序为例 准备工作 1.java-cl ...

  4. 微信小程序 - 骨架屏

    骨架屏 - “与其等待网络加载,不如提前给点暗示” 注:不适用复杂交互效果 演示 示例解释以及使用全在index.wxml中,观看需了解组件使用. 示例下载:微信小程序-骨架屏演示

  5. Java生鲜电商平台-小程序或者APP优惠券的设计与源码实战

    Java生鲜电商平台-小程序或者APP优惠券的设计与源码实战 说明:Java生鲜电商平台-小程序或者APP优惠券的设计与源码实战,优惠券是一种常见的促销方式,在规定的周期内购买对应商品类型和额度的商品 ...

  6. Java生鲜电商平台-小程序或者APP拼团功能设计与架构实战

    Java生鲜电商平台-小程序或者APP拼团功能设计与架构实战 说明:Java生鲜电商平台拼团是拉新引流的利器,将拼团运用到极致的就是拼多多,前期通过选取性价比高.实用性强的商品进行拼团,在社交圈(主要 ...

  7. 微信小程序代码大全 - 小程序开发福利

    小程序QQ交流群:131894955 小程序开发文档(Wepy) 小程序商城源码下载(weixin-app-shop) 小程序官网源码下载(weixin-app-cms) 微信管家平台JAVA版开源下 ...

  8. 微信小程序转百度小程序修改

    百度小程序对比微信小程序(最初版):[设备]项里没有内存监控.iBeacon.wifi.蓝牙.用户截屏.手机联系人.NFC[位置]项里没有打开地图选择位置[界面]项里没有绘图功能.没有节点信息获取功能 ...

  9. vue+uni-app商城实战 | 第一篇:【有来小店】微信小程序快速开发接入Spring Cloud OAuth2认证中心完成授权登录

    一. 前言 本篇通过实战来讲述如何使用uni-app快速进行商城微信小程序的开发以及小程序如何接入后台Spring Cloud微服务. 有来商城 youlai-mall 项目是一套全栈商城系统,技术栈 ...

随机推荐

  1. linux开机执行脚本

    有些服务用命令启动的想要做到开机启动可以 /etc/profile.d/ 下面建一个脚本文件(这个目录优先级最低) #!/bin/bash ... 转载请注明博客出处:http://www.cnblo ...

  2. TCP输出 之 tcp_transmit_skb

    概述 tcp_transmit_skb的作用是复制或者拷贝skb,构造skb中的tcp首部,并将调用网络层的发送函数发送skb:在发送前,首先需要克隆或者复制skb,因为在成功发送到网络设备之后,sk ...

  3. 自定义css样式结合js控制audio做音乐播放器

    最近工作需求需要播放预览一些音乐资源,所以自己写了个控制audio的音乐播放器. 实现的原理主要是通过js调整audio的对象属性及对象方法来进行控制: 1.通过play().pause()来控制音乐 ...

  4. python正则表达式解析(re)

    正则表达式的使用方法主要有4种: re.search(进行正则匹配), re.match(从头开始匹配)  re.findall(找出所有符合条件的字符列表)  re.split(根据条件进行切分)  ...

  5. RN中webview的一些思考

    刚开始只是对接一下RN,h5部分,嵌套在RN里的webview里需要隐藏一些原生的按钮,遇到很多沟通上的问题,本来没使用RN之前,也是嵌套在webview里,也没什么问题,突然RN嵌套就有问题了,对方 ...

  6. Get web site source code

    public String getPageSource() { StringBuffer sb = new StringBuffer(); try { // 构建一URL对象 URL url = ne ...

  7. ASimpleCache源码分析

    ASimpleCache里只有一个JAVA文件——ACache.java,首先我用思维导图制作了ACache类的详细结构图: 通过分析官方给的demo来驱动源码分析吧 以字符串存储为例(官方给的dem ...

  8. 搭建Git服务器及本机克隆提交

    前文 Git是什么? Git是目前世界上最先进的分布式版本控制系统. SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首 ...

  9. SQL学习(八)日期处理

    不同数据库中,针对日期处理的函数不同 Oracle中常用日期函数 (1.sysdate: 获取当前系统时间 如: select sysdate() ----返回当前时间,包括年月日 时分秒 (2.to ...

  10. js判断字符串是否为JSON格式

    不能简单地使用来判断字符串是否是JSON格式: function isJSON(str) { if (typeof str == 'string') { try { JSON.parse(str); ...