记我的第一个GUI小程序之开发心得。

JAVA GUI以前一直只是听听而已,从没下手去做,这次因为自己曾经写过一个命令行下面的TS视频合并代码,共享到CSDN给大伙下载,总觉得太LOW,为什么不能做一个带界面的,也好看些,于是乎在百度上一顿搜索,找到了各种教程和代码,基础知识补齐了就开干了,这是我利用两天时间完成的一个小程序。

很简朴的一个界面
很简朴的一个界面

 

 

 

 

 

 

 

 

 

下面说说我开发中遇到的困难吧

1、首先就是GUI的布局,一开始不得要领,各种模布局模式都用过了,几乎把控件一顿乱拖,代码一顿乱敲,搞出来的东西布局乱七八糟,自己看着都头大,最后我打开了别人的程序界面看了下受到了很大的启发,发现东西南北中布局比较适合。其实布局这玩意不要过多的想法,控件里面都已经按照流行的布局给你分配好了控件的摆放位置,合理即可。

2、这个程序的主要功能就是把零散的TS视频文件按照播放顺序合并成一个可以完整播放的TS视频文件,其中合并的业务逻辑是主要的逻辑,为了增加用户体验我加入了JProgressBar控件,能够实时的反应当前进度。这玩意我上网搜索了好多案例,看的是一头雾水,最后打算自己想办法,无非就是动态的改一下value,那么要想一直监控线程的运行状态,那死循环是必须要有了,于是就在我的线程中独立允许的函数增加一个当前合并文件数量的返回值,利用这个值可以计算合并文件的百分比,这样就可以动态的改变JProgressBar的状态了。

3、JAVA GUI需要用到适配器模式,开发这个小程序,使我对适配器模式有了比较好的理解,作用比较大。有一个功能,就是点击按钮后弹出打开文件的对话框然后选中视频文件夹,我需要把文件夹的路径显示在界面上,这个花了我很久的时间,这个功能的实现就是要编写JButton的onActionListener事件,这个事件需要传递一个ActionListener对象进去,那么问题来了,这个对象NEW出来后,我没法把当前窗体类的控件属性传递过去,也就是说还必须再重新NEW一个窗体对象出来,那是无论如何不行的,于是乎我就想到了适配器模式,就用JFrame类去适配ActionListener接口,这样不需要NEW JFRAME了,也解决了JButton对象的onActionListener事件无法改变当前窗体控件内容的问题,效果很明显。

 

之前是这么写的:

public class TS2TSFORM {

利用适配器模式这样写:

public class TS2TSFORM extends JFrame implements  ActionListener{

这样就不需要NEW 一个ActionListener对象出来,也就解决了无法在按钮点击事件中动态改变当前窗体的控件属性的问题。

这些问题解决后,后面我就很享受GUI开发的过程了,这个TS合并器最终运行结果是这样的。

标题

 

标题

 

 窗体类的业务逻辑:

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.math.BigDecimal;
import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class TS2TSFORM extends JFrame implements  ActionListener{
    private JPanel PANEL0;
    private JButton button1;
    private JButton button5;
    private JButton button4;
    private JButton button3;
    private JButton button2;
    private JProgressBar progressBar1;
    private JLabel label0;
    private JList list1;
    private Ts2ts ts2ts;
    private File basedir ;
    private Thread thread;
    private int tsNums; //检索出来的ts文件个数
    private boolean startFlag ; //开始合并的状态标记;
    private String filepath=null; //存放ts文件的文件夹路径;此路径作为能否开始合并的基本依据,初始为空值。
    Filetools filetools ;
    public TS2TSFORM() {
        filetools = new Filetools();
        progressBar1.setVisible(false);
        progressBar1.setEnabled(true);
        this.filepath = null;
        ts2ts = Ts2ts.getInstance();
        this.setTitle("TS合并器");
        this.setContentPane(this.PANEL0);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocation(600,400);
        this.button1.setText("打开目录");
        this.button2.setText("清空文件");
        this.button3.setText("开始合并");
        this.button4.setText("暂停合并");
        this.button5.setText("终止合并");
        this.button1.addActionListener(this);
        this.button2.addActionListener(this);
        this.button3.addActionListener(this);
        this.button4.addActionListener(this);
        this.button5.addActionListener(this);
        this.setResizable(false);
        this.pack();
        this.setVisible(true);
    }


    public static void main(String[] args) {

        TS2TSFORM ts2form = new TS2TSFORM();
    }


    public void actionPerformed(ActionEvent e){
        //System.out.println(e.getActionCommand());
        if ("打开目录".equals(e.getActionCommand())){
            if (this.filepath != null)
                this.filepath = null;
            label0.setText("");
            JFileChooser jfc = new JFileChooser();
            jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);//设置只能打开目录
            jfc.setMultiSelectionEnabled(true);//设置可多选文件
            jfc.showOpenDialog(new JFrame());//打开文件选择窗
            this.basedir = jfc.getSelectedFile();
            if (this.basedir != null){
                this.filepath = this.basedir.getAbsolutePath();
                Vector<String> tsVector = new Vector<String>();
                Pattern pattern = Pattern.compile("\\d+");
                for (File f : this.basedir.listFiles()){
                    Matcher matcher = pattern.matcher(f.getName());
                    if ((".ts".equals(filetools.getFileExt(f)) ||
                            ".TS".equals(filetools.getFileExt(f)))&&
                            matcher.find()
                    ){
                        tsVector.add(f.getName());
                    }
                }
                if (tsVector.size() > 0){
                    this.list1.setListData(tsVector);
                    tsNums = tsVector.size();
                    this.label0.setText("一共检索出"+tsNums+"个.ts视频文件!可以开始合并操作!!");
                    this.button2.setEnabled(true);
                    this.button3.setEnabled(true);
                    this.button4.setEnabled(true);
                    this.button5.setEnabled(true);
                }else{
                    this.label0.setText("目录中没有.ts视频文件!!");
                }

            }else{
                this.label0.setText("目录选择错误!!");
            }



        }else if ("开始合并".equals(e.getActionCommand())){
            if (this.filepath != null){
                startFlag = true; //标记为开始;
                this.button4.setEnabled(true);
                this.button5.setEnabled(true);
                this.button1.setEnabled(false);
                this.button2.setEnabled(false);
                this.button3.setEnabled(false);
                //起一个独立线程执行合并文件的操作
                Runnable runnable = new Runnable() {
                    public void run() {
                        String msg = null;
                        try {
                            msg = ts2ts.doMerage(filepath,
                                    filepath+"\\"+"merge.ts");
                            if (null == msg){
                                //System.out.println("合并成功!!");
                                label0.setText("合并完成,目文件是:"+filepath+"\\"+"merge.ts");
                            }else{
                                label0.setText(msg);
                                //progressBar1.setValue(0);
                                button1.setEnabled(true);
                                button2.setEnabled(true);
                                button3.setEnabled(true);
                                startFlag = false;//结束进度条显示;
                                //this.pack();
                                //System.out.println(msg);
                            }; //调用合并视频的方法;
                        } catch (Exception e1) {
                            e1.printStackTrace();
                            label0.setText("错误:"+e1.toString());
                        }

                    }
                };
               thread = new Thread(runnable);
               thread.start();
               progressBar1.setVisible(true);
               progressBar1.setEnabled(true);
               if (thread.isAlive())
                    label0.setText("正在合并视频,请稍候!!");
               //起一个独立线程用于progressBar控件的显示;
               Thread thread1 = new Thread(new Runnable() {
                   public void run() {
                       while(startFlag){
                           //System.out.println(ts2ts.getCount() + "/" + tsNums);
                           String format = new BigDecimal(String.valueOf(ts2ts.getCount())).toString();
                           float rr = Float.valueOf(format);
                           int tempInt = Math.round(rr / tsNums * 100);
                           //System.out.println(tempInt);
                           progressBar1.setValue(tempInt);
                           if (tempInt == 100)
                               startFlag = false;
                       }
                   }
               });
               thread1.start();
            }else{
                this.label0.setText("没有选中TS视频目录无法合并!!");
            }
        }else if ("暂停合并".equals(e.getActionCommand())){


        }else if ("清空文件".equals(e.getActionCommand())){

                Vector<String> vector = new Vector<String>();
                this.list1.setListData(vector);
                this.filepath = null;
                this.label0.setText("清空完毕!!");


        }else {
            if (thread != null && thread.isAlive()){
                thread.interrupt();
                label0.setText("任务已终止!!");
                progressBar1.setValue(0);
                button1.setEnabled(true);
                button2.setEnabled(true);
                button3.setEnabled(true);
                startFlag = false;
            }else{
                label0.setText("任务已终止!!");
                progressBar1.setValue(0);
                button1.setEnabled(true);
                button2.setEnabled(true);
                button3.setEnabled(true);
                startFlag = false;
            }

        }



    }
}


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值