如何在swing中运行JavaFXMediaPlayer?
我为我正在开发的一个应用程序制作了一个简单的媒体播放器,问题是我认为可以简单地将JavaFX集成到Swing中。事实并非如此。我一直在寻找解决此问题的方法,并尝试使用此网站: 问题是,即使我有一个解释如何将代码组合在一起的网站,我仍然不明白如何组合。这是mediaplayer,我计划将其集成到我的Swing代码中,以便在单击按钮时调用mediaplayer。这是我为媒体播放器编写的所有代码,如果有人能分享一些关于如何将其集成到我的Swing代码(即我的GUI)中的信息,我可能不得不通过计算机亲吻你如何在swing中运行JavaFXMediaPlayer?,swing,user-interface,javafx-2,Swing,User Interface,Javafx 2,我为我正在开发的一个应用程序制作了一个简单的媒体播放器,问题是我认为可以简单地将JavaFX集成到Swing中。事实并非如此。我一直在寻找解决此问题的方法,并尝试使用此网站: 问题是,即使我有一个解释如何将代码组合在一起的网站,我仍然不明白如何组合。这是mediaplayer,我计划将其集成到我的Swing代码中,以便在单击按钮时调用mediaplayer。这是我为媒体播放器编写的所有代码,如果有人能分享一些关于如何将其集成到我的Swing代码(即我的GUI)中的信息,我可能不得不通过计算机亲吻
public class Player extends Application{
private boolean atEndOfMedia = false;
private final boolean repeat = false;
private boolean stopRequested = false;
private Duration duration;
private Label playTime;
private Slider volumeSlider;
@Override
public void start(final Stage stage) throws Exception {
stage.setTitle("Movie Player");//set title
Group root = new Group();//Group for buttons etc
final Media media = new Media("file:///Users/Paul/Downloads/InBruges.mp4");
final MediaPlayer playa = new MediaPlayer(media);
MediaView view = new MediaView(playa);
//Slide in and out and what causes that.
final Timeline slideIn = new Timeline();
final Timeline slideOut = new Timeline();
root.setOnMouseEntered(new javafx.event.EventHandler<javafx.scene.input.MouseEvent>() {
@Override
public void handle(MouseEvent t) {
slideIn.play();
}
});
root.setOnMouseExited(new javafx.event.EventHandler<javafx.scene.input.MouseEvent>() {
@Override
public void handle(MouseEvent t) {
slideOut.play();
}
});
final VBox vbox = new VBox();
final Slider slider = new Slider();
final Button playButton = new Button("|>");
root.getChildren().add(view);
root.getChildren().add(vbox);
vbox.getChildren().add(slider);
vbox.getChildren().add(playButton);
vbox.setAlignment(Pos.CENTER);
Scene scene = new Scene(root, 400, 400, Color.BLACK);
stage.setScene(scene);
stage.show();
// Play/Pause Button
playButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
Status status = playa.getStatus();
if (status == Status.UNKNOWN || status == Status.HALTED)
{
// don't do anything in these states
return;
}
if ( status == Status.PAUSED
|| status == Status.READY
|| status == Status.STOPPED)
{
// rewind the movie if we're sitting at the end
if (atEndOfMedia) {
playa.seek(playa.getStartTime());
atEndOfMedia = false;
}
playa.play();
} else {
playa.pause();
}
}
});
//Listeners and Shit for Play Button
playa.setOnPlaying(new Runnable() {
@Override
public void run() {
if (stopRequested) {
playa.pause();
stopRequested = false;
} else {
playButton.setText("||");
}
}
});
playa.setOnPaused(new Runnable() {
@Override
public void run() {
playButton.setText(">");
}
});
playa.play();
playa.setOnReady(new Runnable() {
@Override
public void run(){
int v = playa.getMedia().getWidth();
int h = playa.getMedia().getHeight();
stage.setMinWidth(v);
stage.setMinHeight(h);
vbox.setMinSize(v, 100);
vbox.setTranslateY(h-50);
//slider and graphical slide in/out
slider.setMin(0.0);
slider.setValue(0.0);
slider.setMax(playa.getTotalDuration().toSeconds());
slideOut.getKeyFrames().addAll(
new KeyFrame(new Duration(0),
new KeyValue(vbox.translateYProperty(), h-100),
new KeyValue(vbox.opacityProperty(), 0.9)
),
new KeyFrame(new Duration(300),
new KeyValue(vbox.translateYProperty(), h),
new KeyValue(vbox.opacityProperty(), 0.0)
)
);
slideIn.getKeyFrames().addAll(
new KeyFrame(new Duration(0),
new KeyValue(vbox.translateYProperty(), h),
new KeyValue(vbox.opacityProperty(), 0.0)
),
new KeyFrame(new Duration(300),
new KeyValue(vbox.translateYProperty(), h-100),
new KeyValue(vbox.opacityProperty(), 0.9)
)
);
}
});
//Slider being current and ability to click on slider.
playa.currentTimeProperty().addListener(new ChangeListener<Duration>(){
@Override
public void changed(ObservableValue<? extends Duration> observableValue, Duration duration, Duration current){
slider.setValue(current.toSeconds());
}
});
slider.setOnMouseClicked(new javafx.event.EventHandler<javafx.scene.input.MouseEvent>() {
@Override
public void handle(javafx.scene.input.MouseEvent t) {
playa.seek(Duration.seconds(slider.getValue()));
}
});
}
公共类播放器扩展应用程序{
私有布尔值atEndOfMedia=false;
私有最终布尔重复=false;
私有布尔stopRequested=false;
私人期限;
自有品牌游戏时间;
私人滑杆滑杆;
@凌驾
public void start(final Stage)引发异常{
stage.setTitle(“电影播放器”);//设置标题
组根=新组();//按钮等的组
最终媒体=新媒体(“file:///Users/Paul/Downloads/InBruges.mp4");
最终MediaPlayer播放A=新MediaPlayer(媒体);
MediaView=新MediaView(playa);
//滑入滑出以及是什么原因造成的。
最终时间线slideIn=新时间线();
最终时间线滑出=新时间线();
root.setonMouseCenter(新的javafx.event.EventHandler(){
@凌驾
公共无效句柄(MouseEvent t){
slideIn.play();
}
});
setOnMouseExited(新的javafx.event.EventHandler(){
@凌驾
公共无效句柄(MouseEvent t){
slideOut.play();
}
});
最终VBox VBox=新的VBox();
最终滑块=新滑块();
最终按钮播放按钮=新按钮(“|>”);
root.getChildren().add(视图);
root.getChildren().add(vbox);
vbox.getChildren().add(滑块);
vbox.getChildren().add(播放按钮);
vbox.setAlignment(位置中心);
Scene-Scene=新场景(root,400400,Color.BLACK);
舞台场景;
stage.show();
//播放/暂停按钮
playButton.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent e){
Status Status=playa.getStatus();
if(status==status.UNKNOWN | | status==status.stopped)
{
//在这些州什么都不要做
返回;
}
if(status==status.PAUSED
||status==status.READY
||状态==状态。已停止)
{
//如果我们坐在结尾,倒带电影
如果(atEndOfMedia){
playa.seek(playa.getStartTime());
atEndOfMedia=false;
}
playa.play();
}否则{
暂停();
}
}
});
//听众和狗屎播放按钮
playa.setOnPlaying(新的Runnable(){
@凌驾
公开募捐{
如果(请求停止){
暂停();
stopRequested=false;
}否则{
playButton.setText(“| |”);
}
}
});
playa.setOnPaused(新的Runnable(){
@凌驾
公开募捐{
playButton.setText(“>”);
}
});
playa.play();
playa.setOnReady(新的Runnable(){
@凌驾
公开募捐{
int v=playa.getMedia().getWidth();
int h=playa.getMedia().getHeight();
阶段设置最小宽度(v);
阶段.设定高度(h);
vbox.setMinSize(v,100);
vbox.setTranslateY(h-50);
//滑块和图形滑入/滑出
slider.setMin(0.0);
滑块设置值(0.0);
slider.setMax(playa.getTotalDuration().toSeconds());
slideOut.getKeyFrames().addAll(
新关键帧(新持续时间(0),
新键值(vbox.translateYProperty(),h-100),
新的键值(vbox.opacityProperty(),0.9)
),
新关键帧(新持续时间(300),
新的键值(vbox.translateYProperty(),h),
新的键值(vbox.opacityProperty(),0.0)
)
);
slideIn.getKeyFrames().addAll(
新关键帧(新持续时间(0),
新的键值(vbox.translateYProperty(),h),
新的键值(vbox.opacityProperty(),0.0)
),
新关键帧(新持续时间(300),
新键值(vbox.translateYProperty(),h-100),
新的键值(vbox.opacityProperty(),0.9)
)
);
}
});
//滑块是当前的,并且能够单击滑块。
playa.currentTimeProperty().addListener(新的ChangeListener()){
@凌驾
公共无效已更改(可观察值使用
JFXPanel
:
public class Test {
private static void initAndShowGUI() {
// This method is invoked on Swing thread
JFrame frame = new JFrame("FX");
final JFXPanel fxPanel = new JFXPanel();
frame.add(fxPanel);
frame.setVisible(true);
Platform.runLater(new Runnable() {
@Override
public void run() {
initFX(fxPanel);
}
});
}
private static void initFX(JFXPanel fxPanel) {
// This method is invoked on JavaFX thread
Scene scene = createScene();
fxPanel.setScene(scene);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
initAndShowGUI();
}
});
}
}
其中方法createScene()
是代码中的start(final Stage)
。
只需将场景放在舞台上,您就可以将其返回。请注意,虽然JFXPanel可以实现这一点,但性能很差,因为JFXPanel。对于简单的GUI来说,这并不重要,但对于媒体播放来说,它确实重要。目前除了使用完整的JavaFX应用程序外,没有解决方案。如果将来的JavaFX版本添加了ABL要在JavaFX窗口中嵌入Swing组件,这可能是比在Swing中嵌入JavaFX更好的技术。