进度条组件:
import javafx.geometry.Insets;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressBar;
import javafx.scene.layout.HBox;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import util.Handler;
import java.math.BigDecimal;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* 进度条组件
*/
public class MyProgressBar {
private static final Logger LOG = LoggerFactory.getLogger(MyProgressBar.class);
private HBox hBox;
/**
* 进度条标题
*/
private Label title;
/**
* 进度条
*/
private ProgressBar progressBar;
/**
* 进度条提示
*/
private Label message;
/**
* 每个步骤所占的比例
*/
private Double step;
/**
* 进度条总量
*/
private Double total = 0.0;
/**
* 更新进度提示
* @param message
*/
public void setLabel(String message) {
this.message.setText(message);
}
/**
* 更新进度条
* @param value
*/
public void setValue(double value) {
if(value == 0) {
total = 0.0;
}
progressBar.setProgress(value);
}
/**
* 控制进度条组件显示
* @param flag
*/
public void setVisible(boolean flag) {
progressBar.setVisible(flag);
title.setVisible(flag);
message.setVisible(flag);
hBox.setDisable(!flag);
}
/**
* 获取进度条组件
* @return
*/
public HBox getProgressBar() {
hBox = new HBox();
hBox.setPadding(new Insets(5));
progressBar = new ProgressBar();
message = new Label();
if(title != null) {
hBox.getChildren().addAll(title);
}
hBox.getChildren().addAll(progressBar, message);
//默认不显示
setVisible(false);
return hBox;
}
public MyProgressBar(String title) {
this.title = new Label(title);
}
public MyProgressBar() {}
/**
* 计算进度条步长
* @param stepTotal
* @return
*/
public void calculationStep(int stepTotal) {
BigDecimal dividend = new BigDecimal("1");
BigDecimal divisor = new BigDecimal(stepTotal);
LOG.info("进度组件: 计算进度条步长 除数: {}", divisor);
LOG.info("被除数: {}, 除数: {}, 结果: {}", dividend, divisor, dividend.divide(divisor, 2, BigDecimal.ROUND_UP).doubleValue());
step = dividend.divide(divisor, 2, BigDecimal.ROUND_UP).doubleValue();
}
/**
* 自动累加
*/
public void autoAdd() {
if(null == step) {
new RuntimeException("未计算进度条step!");
}
total += step;
LOG.info("进度条进度: {}", total);
setValue(total);
}
}
进度条调用:
//计算进度条step
batchProgressBar.calculationStep();
//显示进度条并给初始值
batchProgressBar.setVisible(true);
batchProgressBar.setValue(0.0);
batchProgressBar.setLabel("开始执行");
//在后台代码执行时需要更新界面UI,用此方法
Platform.runLater(new Runnable() {
@Override
public void run() {
batchProgressBar.autoAdd();
batchProgressBar.setLabel("正在截取视频图片 " + Handler.getFileName(path));
}
});
文件选择器:
import javafx.stage.DirectoryChooser;
import javafx.stage.FileChooser;
import javafx.stage.FileChooser.ExtensionFilter;
/**
* @author xinhai.ma
* @description 文件选择器
* @date 2020/5/9 9:04
*/
public class MyChooser {
public static DirectoryChooser getDirectoryChooser() {
DirectoryChooser directoryChooser = new DirectoryChooser();
return directoryChooser;
}
/**
* 功能描述 返回视频选择器
* @author xinhai.ma
* @date 2020/5/9 22:27
* @return javafx.stage.FileChooser
*/
public static FileChooser getFileChooser() {
FileChooser fileChooser = new FileChooser();
//在文件选择器做了格式限制
fileChooser.getExtensionFilters().addAll(
new ExtensionFilter("MP4", "*.mp4"));
/*new ExtensionFilter("AVI", "*.avi"),*/
/*new ExtensionFilter("RM", "*.rm"),*/
/*new ExtensionFilter("WMV", ".wmv"),*/
/*new ExtensionFilter("FLV", ".flv"),*/
/*new ExtensionFilter("MPEG", ".mpeg")*/
return fileChooser;
}
/**
* 功能描述 返回exe选择器
* @author xinhai.ma
* @date 2020/5/9 22:27
* @return javafx.stage.FileChooser
*/
public static FileChooser getExeFileChooser() {
FileChooser fileChooser = new FileChooser();
//在文件选择器做了格式限制
fileChooser.getExtensionFilters().addAll(
new ExtensionFilter("EXE", "*.exe"));
return fileChooser;
}
/**
* 功能描述 返回图片选择器
* @author xinhai.ma
* @date 2020/5/9 22:27
* @return javafx.stage.FileChooser
*/
public static FileChooser getImageChooser() {
FileChooser fileChooser = new FileChooser();
//在文件选择器做了格式限制
fileChooser.getExtensionFilters().addAll(
new ExtensionFilter("JPEG", "*.jpg"),
new ExtensionFilter("PNG", "*.png"),
new ExtensionFilter("GIF", "*.gif"),
new ExtensionFilter("BMP", "*.bmp"));
return fileChooser;
}
/**
* 功能描述 返回所有文件选择器
* @author xinhai.ma
* @date 2020/5/9 22:27
* @return javafx.stage.FileChooser
*/
public static FileChooser getAllFileChooser() {
FileChooser fileChooser = new FileChooser();
return fileChooser;
}
}
文件选择器调用:
// 选择的文件夹
File file = MyChooser.getDirectoryChooser().showDialog(primaryStage);
弹窗提示组件:
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Modality;
import javafx.stage.Stage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import util.Handler;
import java.util.List;
/**
* @author xinhai.ma
* @description 弹窗提示组件
* @date 2020/5/9 9:05
*/
public class MyAlertBox {
private static final Logger LOG = LoggerFactory.getLogger(MyAlertBox.class);
public static void display(String title, String message) {
LOG.info("弹窗提示: {}", message);
Stage window = new Stage();
window.setTitle(title);
// modality要使用Modality.APPLICATION_MODEL
window.initModality(Modality.APPLICATION_MODAL);
window.setMinWidth(300);
window.setMinHeight(150);
Button button = new Button("知道了");
button.setOnAction(e -> window.close());
Label label = new Label(message);
VBox layout = new VBox(10);
layout.getChildren().addAll(label, button);
layout.setAlignment(Pos.CENTER);
Scene scene = new Scene(layout);
window.setScene(scene);
// 使用showAndWait()先处理这个窗口,而如果不处理,main中的那个窗口不能响应
window.showAndWait();
}
}
弹窗组件调用:
MyAlertBox.display("提示", "处理视频数量大于100,请减少视频数量!");
列表组件:
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import util.Handler;
/**
* @author xinhai.ma
* @description 列表组件
* @date 2020/5/9 9:01
*/
public class MyListView {
private static final Logger LOG = LoggerFactory.getLogger(MyListView.class);
/**
* 列表视图
*/
private ListView<String> listView = new ListView<>();
/**
* 显示选中项label
*/
private final Label label = new Label();
/**
* 所有视频地址(不带省略号)
*/
private List<String> filePathList = new ArrayList<>();
/**
* 所有简洁路径地址
*/
private List<String> simplePathList = new ArrayList<>();
/**
* 当前播放的视频地址
*/
private String currentVideoPath;
public List<String> getFilePathList() {
return filePathList;
}
/**
* 获得当前正在播放的视频文件地址
* @return
*/
public String getCurrentVideoPath() {
return currentVideoPath;
}
/**
* 设置列表视图大小
* @param width
* @param height
*/
public void setListVideoSize(double width, double height) {
listView.setPrefSize(width, height);
}
/**
* 传入数据集合获得列表视图
*/
public VBox getListView() {
VBox box = new VBox();
box.getChildren().addAll(listView, label);
VBox.setVgrow(listView, Priority.ALWAYS);
label.setLayoutX(10);
label.setLayoutY(115);
label.setMaxWidth(200);
label.setWrapText(true);
label.setFont(Font.font("Verdana", 12));
listView.setPrefWidth(120);
listView.setMaxWidth(200);
listView.setPrefHeight(280);
ObservableList<String> data = FXCollections.observableArrayList(simplePathList);
listView.setItems(data);
listView.getSelectionModel().selectedItemProperty()
.addListener((ObservableValue<? extends String> ov, String old_val, String new_val) -> {
LOG.info("您点了第{}项,视频名称是{}", listView.getSelectionModel().getSelectedIndex(), listView.getSelectionModel().getSelectedItem());
currentVideoPath = filePathList.get(listView.getSelectionModel().getSelectedIndex());
label.setText(new_val);
});
return box;
}
public MyListView(List<String> dataList) {
if(null == dataList || 0 == dataList.size()) {
LOG.info("初始化filePathList,dataList为空,填入暂无数据");
dataList = Arrays.asList("暂无数据");
simplePathList.add("暂无数据");
filePathList.addAll(dataList);
} else {
LOG.info("初始化filePathList,dataList不为空,填入dataList");
filePathList.addAll(dataList);
//使文件列表展示更加简洁
LOG.info("初始化simplePathList");
simplePathList = Handler.getSimplePathList(dataList);
}
}
}
列表组件调用:
//构造方法传入要显示的内容List
MyListView videoView = new MyListView(unProcessedList);
//拿到列表视图对象
videoView.getListView()
更多Java Fx组件运用参考项目:https://github.com/mxh1997java/VideoProcess
Java Fx官方文档:http://www.javafxchina.net/main/