解释一下以下代码: 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 20:06:59 浏览: 58
这段代码主要是创建一个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(); }`:这是捕获任何可能出现的异常并打印出来,以便调试程序。

相关推荐

import java.awt.EventQueue; import java.awt.Font; import java.awt.LayoutManager; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; @SuppressWarnings("serial") public class LogInPage extends JFrame { private JPanel contentPane; public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { LogInPage frame = new LogInPage(); frame.setVisible(true); } catch (Exception var2) { var2.printStackTrace(); } } }); } public LogInPage() { this.setDefaultCloseOperation(3); this.setBounds(100, 100, 450, 300); this.contentPane = new JPanel(); this.contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); this.setContentPane(this.contentPane); this.contentPane.setLayout((LayoutManager)null); JLabel lblNewLabel = new JLabel("图书管理系统"); lblNewLabel.setBounds(130, 10, 174, 34); lblNewLabel.setFont(new Font("宋体", 0, 29)); this.contentPane.add(lblNewLabel); JButton btnNewButton = new JButton("管理员登录"); btnNewButton.setFont(new Font("宋体", 0, 17)); btnNewButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Manager_Login MPage = new Manager_Login(); MPage.setVisible(true); } }); btnNewButton.setBounds(146, 92, 144, 39); this.contentPane.add(btnNewButton); JButton btnNewButton_1 = new JButton("读者登录"); btnNewButton_1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { User_Login UPage = new User_Login(); UPage.setVisible(true); } }); btnNewButton_1.setFont(new Font("宋体", 0, 17)); btnNewButton_1.setBounds(146, 159, 144, 39); this.contentPane.add(btnNewButton_1); } }

import java.awt.Color; import java.awt.EventQueue; import java.awt.Graphics; import javax.swing.JFrame; import javax.swing.JPanel; class BilliardBallFrame extends JFrame { public static void main(String[] args){ EventQueue.invokeLater(new Runnable(){ public void run(){ BilliardBallFrame frame=new BilliardBallFrame(); frame.setVisible(true); } }); } public BilliardBallFrame(){ super(); setBounds(100,100,326,202); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setTitle("撞球动画"); BilliardBallPanel panel=new BilliardBallPanel(); getContentPane().add(panel); Thread thread=new Thread(panel); thread.start(); } class BilliardBallPanel extends JPanel implements Runnable{ int x1=0; int y1=60; int width=30; int height=30; int x2=326-30; int y2=60; public void paint(Graphics g){ //绘制两个小球 g.clearRect(0, 0, getWidth(), getHeight()); g.setColor(Color.BLUE); g.fillOval(x1, y1, width, height); g.setColor(Color.RED); g.fillOval(x2, y2, width,height); } public void run(){ boolean flag1=true; boolean flag2=true; while(true){ if(x1+width>=x2+1){ //小球撞击 x1=x1+5; width=width-10; x2=x1+width; flag1=false; flag2=false; repaint(); }else{ //小球1从左向右移动 if(flag1){ x1=x1+10; width=30; }else{ //小球1从右向左移动 x1=x1-10; width=30; //小球1撞墙 if(x1<=0){ x1=0; flag1=true; } } if(flag2){ //小球2从向左移动 x2=x2-10; width=30; }else{ //相撞后从左向右移动 x2=x2+10; width=30; //小球2撞墙 if(x2>=getWidth()-width){ x2=getWidth()-width; flag2=true; } } } try { Thread.sleep(200); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } repaint(); } } } }

at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) at java.awt.Component.processMouseEvent(Component.java:6527) at javax.swing.JComponent.processMouseEvent(JComponent.java:3321) at java.awt.Component.processEvent(Component.java:6292) at java.awt.Container.processEvent(Container.java:2234) at java.awt.Component.dispatchEventImpl(Component.java:4883) at java.awt.Container.dispatchEventImpl(Container.java:2292) at java.awt.Component.dispatchEvent(Component.java:4705) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462) at java.awt.Container.dispatchEventImpl(Container.java:2278) at java.awt.Window.dispatchEventImpl(Window.java:2739) at java.awt.Component.dispatchEvent(Component.java:4705) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746) at java.awt.EventQueue.access$400(EventQueue.java:97) at java.awt.EventQueue$3.run(EventQueue.java:697) at java.awt.EventQueue$3.run(EventQueue.java:691) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86) at java.awt.EventQueue$4.run(EventQueue.java:719) at java.awt.EventQueue$4.run(EventQueue.java:717) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75) at java.awt.EventQueue.dispatchEvent(EventQueue.java:716) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

最新推荐

recommend-type

华中科技大学电信专业 课程资料 作业 代码 实验报告-数据结构-内含源码和说明书.zip

华中科技大学电信专业 课程资料 作业 代码 实验报告-数据结构-内含源码和说明书.zip
recommend-type

java 游戏飞翔的小鸟

java 制作游戏 飞翔的小鸟
recommend-type

setuptools-25.3.0.zip

Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用 Python 画一个可以动的爱心

好的,我可以帮助您使用Python来绘制一个动态的爱心。您可以使用turtle库来实现。以下是实现代码: ```python import turtle import math # 设置画布和画笔 canvas = turtle.Screen() canvas.bgcolor("black") pencil = turtle.Turtle() pencil.speed(0) pencil.color("red", "pink") pencil.pensize(3) # 定义爱心函数 def draw_love(heart_size, x_offset=0, y_offset=0):
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

实现实时监控告警系统:Kafka与Grafana整合

![实现实时监控告警系统:Kafka与Grafana整合](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2pwZy9BVldpY3ladXVDbEZpY1pLWmw2bUVaWXFUcEdLT1VDdkxRSmQxZXB5R1lxaWNlUjA2c0hFek5Qc3FyRktudFF1VDMxQVl3QTRXV2lhSWFRMEFRc0I1cW1ZOGcvNjQw?x-oss-process=image/format,png) # 1.1 Kafka集群架构 Kafka集群由多个称为代理的服务器组成,这