解释一下以下代码: EventQueue.invokeLater(new Runnable() { public void run() { try { frame = new MainWindow(); frame.setVisible(true); String options[] = {"--subsdec-encoding=GB18030"};//指定字幕文件编码格式 //让窗体获得默认路径下的视频资源 frame.getMediaPlayer().prepareMedia("E:\\qq下载\\bagong.mp4",options); new SwingWorker<String, Integer>() { protected String doInBackground() throws Exception { while (true) { //获得当前视频总时间长度 long total = frame.getMediaPlayer().getLength(); //获得当期播放时间 long curr = frame.getMediaPlayer().getTime(); //获取播放视频的百分比 float percent = ((float)curr/total); publish((int)(percent*100)); Thread.sleep(100); } } protected void process(java.util.List<Integer> chunks) { for (int v:chunks) { frame.getProgressBar().setValue(v);//设置进度条值 } }; }.execute(); } catch (Exception e) { e.printStackTrace(); } } }); }
时间: 2023-06-26 09:06:59 浏览: 84
这段代码主要是创建一个GUI窗口,并在其中显示视频,并且在窗口中添加一个进度条用以显示视频播放的进度。
具体来说,该代码使用了Swing库中的EventQueue.invokeLater()方法来启动一个新的线程,该线程运行的是一个Runnable对象。在该Runnable对象的run()方法中,首先创建了一个MainWindow对象,即GUI窗口,并将其设置为可见。接着,通过调用MainWindow对象的getMediaPlayer()方法来获取视频播放器对象,并调用其prepareMedia()方法来准备播放指定路径下的视频文件。该方法的第二个参数options[]用于指定字幕文件的编码格式,这里使用了GB18030编码。
接下来,通过创建一个SwingWorker对象来实现视频播放进度的显示。SwingWorker是一个抽象类,用于在后台执行长时间运行的任务,并在主线程中更新GUI。在本例中,SwingWorker的doInBackground()方法中,通过循环获取视频播放器对象的总时长和当前播放时间,并计算出播放进度的百分比,然后将该百分比值传递给process()方法中进行处理。在process()方法中,通过调用MainWindow对象的getProgressBar()方法来获取进度条对象,并将百分比值设置为进度条的当前值。最后通过调用SwingWorker对象的execute()方法来开始执行视频播放进度的显示。
相关问题
EventQueue.invokeLater(new Runnable() { public void run() { try { Gui frame = new Gui(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } });
这段代码使用了Java Swing框架,并创建了一个GUI窗口(Gui类的实例),并将其设置为可见。
EventQueue.invokeLater()是Java Swing框架中的一个方法,用于在Event Dispatching Thread(EDT)中异步执行一个Runnable对象。EDT是Swing框架中用于处理GUI事件的线程,因此所有Swing组件的创建和修改操作都应该在EDT中执行。
在这段代码中,我们传递了一个Runnable对象给invokeLater()方法,并重写了其run()方法。在run()方法中,我们创建了一个Gui类的实例,并将其设置为可见。
需要注意的是,如果我们在主线程中直接创建和显示GUI组件,会导致GUI界面反应缓慢甚至崩溃。因此,使用EventQueue.invokeLater()方法可以确保GUI组件的创建和修改在EDT中异步执行,保证了GUI界面的稳定性和反应速度。
public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { AddCourseFrm frame = new AddCourseFrm(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } });分析每一句的作用
这段代码是一个 Java 程序的入口方法,它的作用是启动一个可视化界面。
具体分析如下:
1. `public static void main(String[] args)`:这是 Java 程序的入口方法,它会在程序启动时自动执行。
2. `EventQueue.invokeLater(new Runnable() { ... })`:这是通过事件队列来启动 GUI 线程的方法,可以保证在正确的线程上运行 GUI 代码。
3. `new Runnable() { ... }`:这是一个匿名内部类,用于实现 Runnable 接口中的 run() 方法,以便在 GUI 线程上运行代码。
4. `public void run() { ... }`:这是 Runnable 接口中的 run() 方法的具体实现。
5. `AddCourseFrm frame = new AddCourseFrm();`:这是创建了一个名为 AddCourseFrm 的窗口对象,并将其赋值给变量 frame。
6. `frame.setVisible(true);`:这是显示窗口的方法,将窗口设置为可见状态。
7. `catch (Exception e) { e.printStackTrace(); }`:这是捕获任何可能出现的异常并打印出来,以便调试程序。
阅读全文