进度条组件:
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/