javafx为什么 javafx Duration为什么unknow
大家好,今天小编来为大家解答以下的问题,关于javafx为什么,javafx Duration为什么unknow这个很多人还不知道,现在让我们一起来看看吧!
javafx Duration为什么unknow
因为MediaPlayer状态(值)不一样,
当MediaPlayer.Status处于UNKNOWN时(刚刚创建时的状态),
那么获取结束时间结果也是UNKNOWN.
代码片段一:
Mediamd=newMedia(this.getClass().getResource("a.mp4").toString());
MediaPlayermp=newMediaPlayer(md);
MediaViewmv=newMediaView(mp);
mp.setAutoPlay(true);
System.out.println("创建后的状态"+mp.getStatus());//UNKOWN
System.out.println(mp.getStopTime());
代码片段二:设置了开始时刻,和结束时刻
Mediamd=newMedia(this.getClass().getResource("a.mp4").toString());
MediaPlayermp=newMediaPlayer(md);
MediaViewmv=newMediaView(mp);
mp.setAutoPlay(true);
mp.setStartTime(Duration.seconds(5));//5秒的位置开始
mp.setStopTime(Duration.seconds(10));//10秒的位置结束
System.out.println(mp.getStatus());//打印MediaPlayer的状态
System.out.println(mp.getStopTime());//结束的时刻10毫秒处结束
System.out.println(mp.getTotalDuration());//总播放时间结束时刻-开始时刻=总播放时间
完整的代码如下
/////////////////////////////////////////////////////////////////////////////////
importjavafx.application.Application;
importjavafx.scene.Scene;
importjavafx.scene.layout.BorderPane;
importjavafx.scene.media.*;
importjavafx.stage.Stage;
publicclassMediaViewDemoextendsApplication{
publicstaticvoidmain(String[]args){
launch(args);
}
@Override
publicvoidstart(StageprimaryStage)throwsException{
BorderPaneroot=newBorderPane();
Mediamd=newMedia(this.getClass().getResource("a.mp4").toString());
MediaPlayermp=newMediaPlayer(md);
MediaViewmv=newMediaView(mp);
mp.setAutoPlay(true);
System.out.println("创建后的状态"+mp.getStatus());
root.setCenter(mv);
Scenescene=newScene(root,300,200);
primaryStage.setScene(scene);
primaryStage.setTitle("视频播放");
primaryStage.show();
//添加一个鼠标点击后的事件处理
mv.setOnMouseClicked(e->{
//如果视频处于播放状态.那么点击后就暂停
if(mp.getStatus()==MediaPlayer.Status.PLAYING){
mp.pause();
}else{//其余状态,试图播放视频
mp.play();
}
});
//状态改变时,输出最新的状态
mp.statusProperty().addListener((ob,oldValue,newValue)->{
System.out.println("状态:"+newValue);
});
}
}
JavaFX绑定探究
数据绑定连接一些对象并且使它们同步尽管Swing的开发者们取决于额外的类库但是绑定是完全融入了JavaFX Script编程语言仔细看一看它运行的库显示了一个完全绑定构架其基本概念与JGoodies Binding和 Beans Binding很相似(在我以前的文章 Binding Beans中有做过比较) JSR(Beans Binding)可能不会成为Java的一部分所以一直寻找可代替品的开发者们会问自己 JavaFX绑定构架是否可以通过简单的Java程序而进行使用
JavaFX建立在普通的Java SE运行上为了在本文中展示这个示例你需要为你的操作系统(在此只支持官方的Windows和Mac OS X)下载合适的JavaFX SDK具体请参考Resources安装installation过程只需要几个步骤在Windows的机器上默认安装地址是C:\Program Files\JavaFX\javafx sdk Mac OS X users should look at/Library/Frameworks/JavaFX framework/Versions/
图 JavaFX SDK基础目录
图显示了JavaFX SDK的基础目录这个bin目录包括可执行编译并运行JavaFX Script程序我们不使用它们 JavaFX(Script)documentation在docs中文件src zip包括部分JavaFX运行的来源如果你打开它你会注意到文件是以stg和 st结尾的最后lib和它的子目录包含库 jars本文的示例取决于它们中的一些
Locations
lib/shared/javafxrt jar包含 sun javafx runtime location包它的类和接口来自基本的JavaFX Binding的构建块例如 Location接口代表一个值它可能是可变的或是不能改变的有效或无效的空的或是非空这样的状态可以通过相应的getters来查询例如 isMutable()如果Location的值是无效的当update()方法被调用时或该值被检索时它会被更新
一个Location的类型是通过子接口来决定的;例如 IntLocation如果你要在src zip中查询IntLocation java你不会看到它这是因为它的来源是来自两个文件XxxLocation st和XxxTemplate stg每个子接口为类型XYZ添加getAsXYZ和and setAsXYZ()还有DoubleLocation FloatLocation ShortLocation CharLocation LongLocation BooleanLocation ByteLocation和 ObjectLocation
其他的对象可能会附属于一个Location当值与地址变化联系在一起的时候 change listeners可以接收到通知最后 Locations是很懒惰的虽然当值无效的时候change listeners会得到通知但是新的值不会被重新计算直到需要它的时候到目前为止我指谈论了接口的问题当然可以为我以上所提到的类型而随时执行Locations
public static void main(String[] args){
final IntVariable i= IntVariable make();
i addChangeListener(new ChangeListener(){
@Override
public boolean onChange(){
System out println( onChange():+ i get());
return false;
}
});
System out println(i get()+
isMutable():+ i isMutable());
IntLocation i= IntConstant make();
System out println(i get()+
isMutable():+ i isMutable());
i set(i get());
}
为了编译并运行LocationDemo请附加lib/shared/javafxrt jar到你的类路径上这个演示示例采用了IntVariable和IntConstant类两个都执行了IntLocation接口因此是Locations使用静态make()方法创建Instances使用get()查询当前值正如你在图中所看到的在初始化引发一个通知之后设置一个值它通过子抽象类ChangeListener来进行处理
图 LocationDemo输出
当地址内容已经改变的时候它的onChange()方法被调用该方法返回一个Boolean值指示监听者是否仍然有效返回false将导致监听者从监听者名单上删除 Javadoc建议当相关的弱引用被报告清除的时候那些做它们自己弱引用管理的监听者应该返回false
就像JGoodies Binding的ValueModel还有Beans Binding的Property一样 Locations读取和编写类型值提供了一个方法它们也可以通知注册的监听者关于值的变化最后你将会在以下的小节中看到它们用于建立绑定
建立绑定
像Beans Binding和JGoodies Binding一样 JavaFX运行包含一个辅助类来建立绑定 sun javafx runtime location Bindings它是用于在两个Locations之间建立bijective关系这个意思是说如果一个值被更新它所对应的也会被更新在Locations被实例之后它们被传递到bijectiveBind()
public class BindingDemo{
private static IntLocation i i;
public static void main(String[] args){
i= IntVariable make();
i= IntVariable make();
Bindings bijectiveBind(i i);
showValues();
i setAsInt();
showValues();
i setAsInt();
showValues();
}
private static void showValues(){
System out println( i:+ i get());
System out println( i:+ i get());
}
}
bijectiveBind(i i)在i和 i之间建立两种依赖关系如果其中一个被更新例如调用setAsInt()其他的值也会变化为了到达此目的执行附加了两个监听者在Locations中分享状态方便的方法makeBijectiveBind()创建一个新的Location并它绑定到现存的绑定上面如下所示
i= IntVariable make();
i= Bindings makeBijectiveBind(i);
BindingDemo展示了如何使用它它包含在/today////sources zip中具体细节请参考Resources图显示了它的输出
图 BindingDemo输出
请注意只有可编译的类型才能使用bijectiveBind()来进行绑定以下的代码行取自BindingDemo java(包含在sources zip中的)第一眼看上去代码没什么问题但是它们会抛出ClassCastException异常这里发生什么事情了呢?
ObjectLocation loc= IntVariable make();
ObjectLocation loc= BooleanVariable make();
Bindings bijectiveBind(loc loc);
在创建绑定的过程中 loc get()结果被传递到loc的set()方法中这个不会为Boolean和 Integer工作的为了避免这种问题只要适当的确定参数泛型类型ObjectLocation目前为止我们已经看到两个变量是如何被同步的以下的小节中将看一看Swing组件是如何被绑定的
绑定Swing组件
几乎每个JavaFX Script教程都是由显示一个窗口按钮或是标签的小程序开始的 JavaFX使用Swing来构建并显示这些组件因此我们可以假设Swing融入了JavaFX运行不久你将会看到这个也会应用于绑定
lib/desktop/javafx swing jar文件包含javafx ext swing包它的类包含了大多数常见的Swing组件如果你检查它们你将会注意到它们用$开始显示各区域它们的类型是ObjectVariable它可以执行ObjectLocation
图在Eclipse的Members视图中SwingLabel
考虑到这个接口属于 sun javafx runtime location包它是安全的假设这样的Locations可以绑定到其他的变量上以下的程序展示你是如何做到这个的为了编译并运行这个示例请添加lib/shared/javafxrt jar lib/desktop/javafx swing jar lib/desktop/Scenario jar以及 lib/desktop/javafxgui jar到你的类路径上
public class SwingDemo{
public static void main(String[] args){
JFrame f= new JFrame();
f setDefaultCloseOperation(JFrame EXIT_ON_CLOSE);
JPanel p= new JPanel(new BorderLayout());
f setContentPane(p);
SwingLabel label= new SwingLabel();
ObjectLocation text=
Bindings makeBijectiveBind(label$text);
p add(label getJComponent() BorderLayout CENTER);
f pack();
f setVisible(true);
text set( Hello JavaFX!);
}
}
除了这个很有用的创建并显示窗口的Swing代码之外还有三件比较重要的事情要做SwingLabel被实例化并分配到label
Location被分配到test并绑定到label的$text上
标签被有层次的添加到组件上
请注意你不能直接添加SwingLabel到容器中相反它的getJComponent()方法用来获取JComponent实例
虽然这个简单的例子展示了一个Swing组件如何被绑定到一个变量上的但是却没有说明使用JavaFX绑定的好处在我以前的文章 Binding Beans中我演示了如何使用JGoodies Binding和 Beans Binding来执行一个简单的音量控制
VolumeControl示例
音量控制是基于一个简单的特定应用的POJO叫做Volume它有两个区域 volume和mute如图所示它通过一个复选框和一个滑块进行操作标签显示现在的volume值除此之外 mute控制音量是否调整
图音量控制示例
涉及Swing组件和POJO区域之间的关系如下
复选框设置mute
滑块设置volume
Mute选择或不选择复选框
Volume设置成滑块的位置
Mute启用或禁用滑块
Volume设置标签文本
完整的来源包含在sources zip中细节请参考Resources部分它的结构很像我以前的文章中的版本所以很容易比较不同的版本为了编译并运行VolumeControl请添加lib/shared/javafxrt jar lib/desktop/javafx swing jar lib/desktop/Scenario jar和lib/desktop/javafxgui jar到你的类路径
首先所有相关的组件都要初始化这个发生在initComponents()中例如垂直坏块被创建并有如下设置
sliderVolume= new SwingSlider();
sliderVolume$vertical set(true);
在initEventHandling()中建立绑定例如复选框与mute链接用以下命令Bindings bijectiveBind(checkboxMute$selected volume mute);当复选框被选择的时候禁用滑块是通过添加一个监听者到mute上实现的
volume mute addChangeListener(new ChangeListener(){
@Override
public boolean onChange(){
sliderVolume$enabled set(! volume mute get());
return true;
}
});
每次volume mute改变的时候 onChange()就会被调用如果它变成true滑块就被禁用如果变成false滑块就再次使用这个状态用sliderVolume$enabled set()来设置相同的方法同样适用于创建标签文本滑块的值用Integer代表正如我们早前已经看到的它不能绑定到Strings上转换完成如下public boolean onChange(){
labelInfo$text set(volume volume get() toString());
return true;
}
通过使用toString() get()结果变成a String并传递labelInfo$text set()很惊讶的看到JavaFX绑定在Swing应用程序中的使用是如此简单虽然绑定构架还没有为这个所设计但是它是一个相当体面的工作尽管如此本文还是故意忽视了一些问题
Sun会允许使用并可能重新分配部分JavaFX运行给非JavaFX应用程序吗?
如何安全使用内部类?这里所描述的包还没有被设计成公共的APIS
为什么没有成熟的绑定构架给Swing开发者们使用?
lishixinzhi/Article/program/Java/JSP/201311/19126为什么我在安装java的时候会出现这个
1.验证错误
有一种情况非常匪夷所思:即使你确定Java安装正确,但仍然会报错!如果出现这种情况,你可以通过验证Java是否可以正常工作来排除这个错误,点击这个页面,就可以进行验证。如果可以正常工作,那就说明没有问题。
2.与旧版本冲突
如果Java安装成功,但没有正常工作,这个时候你需要查看Windows的控制面板,看看里面是否存在Java的控制版块。如果没有,问题往往是JavaFX与旧的Java代码冲突导致的。
解决办法是,在Windows控制面板中删除所有的Java实例,然后清理Windows中遗留的Java代码片段,重新安装即可。
3.使用离线安装
安装Java,通常我们都会使用在线的方式,但这种方式往往都会出现一些稀奇古怪的问题。所以,我们不妨使用离线的安装方式。在Java的官方网站上,你可以选择适合自己系统的Java安装包。
4.尝试32位版本
相信很多使用64位版本系统的开发者,都会选择适合这个系统版本的Java,看似这是个合理的选择。但是,相比于64位版本,使用32位版本的Java好像影响也不是很大。所以,如果你安装64位版本遇到麻烦了,这里建议你换成32位版本。
5.使用管理员权限安装
如果你使用Windows 7或Windows 8系统安装Java失败时,你可以尝试下使用管理员(administrator)权限进行安装。首先,你需要下载好所需的Java的安装包,然后右键点击文件,选择“以管理员身份运行”选项。
6.暂时禁用用户账户控制
有开发者表示用户账户控制功能可能会影响Java的安装。如果你确实怀疑,你可以暂时禁用它。当然,不同的Windows版本关闭它的方式不一样。
7.设置IE浏览器的安全性为默认级别
如果你的Internet Explorer的安全级别比默认要高,或者设置的是自定义的安全级别,那么很可能造成Java的安装失败。这时候你只要将其设置为默认级别即可。打开IE浏览器,进入“Internet选项”,这里面可以设置安全级别。
8.暂时禁用杀毒软件自动扫描
有很多杀毒软件都会阻止Java的正常安装。这里建议你下载离线版本,然后使用杀毒软件进行全盘扫描,确保自己系统没有感染任何病毒。然后暂定它,再安装Java。安装完成之后,你就可以继续使用杀毒软件。
9.检查用户配置文件
据微软表示,已经被损坏的用户配置文件很可能就是导致Java安装失败的罪魁祸首。这时候你可以创建一个新的用户,并为该用户分配本地的管理权限,然后登陆该账户,再进行Java的安装。
10.使用系统配置工具
Java安装失败,往往与系统正在运行的其他软件有关系,这时候你需要暂时禁止这些软件的运行。最简单的方法是,打开运行,输入MSCONFIG,启动Windows系统配置程序,这里你可以选择要禁用的启动项。
关于javafx为什么和javafx Duration为什么unknow的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。