2016-11-08 72 views
1

我和我的朋友正在编写一个用于rickroll人的小型javafx 8程序。一旦你打开它,如果你试图关闭它,它会再次回来,拖走它也不起作用。但是,我们遇到了一个问题:一旦你启动程序并关闭它,1秒钟后它重新打开,但mediaplayer冻结,我们无法弄清楚原因。编辑:当你重新打开时,mediaplayer不会立即冻结,1秒后它重新打开冻结。所以它重新打开,打得很好,但如果你等待,并让它在重新打开后播放1秒钟,它就会冻结。在javafx中,我的mediaplayer冻结,如果我关闭并重新打开场景

这就是如何MediaPlayer正在创建的:

Media media = new Media(getClass().getResource("/res/video.mp4").toString()); 
    mediaPlayer = new javafx.scene.media.MediaPlayer(media); 
    mediaPlayer.setAutoPlay(true); 
    mediaPlayer.setCycleCount(MediaPlayer.INDEFINITE); 
    MediaView mediaView = new MediaView(mediaPlayer); 

当窗口关闭时,我们暂停视频1秒钟,使用此代码:

primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() { 
     @Override 
     public void handle(WindowEvent we) { 
     primaryStage.close(); 
     mediaPlayer.pause(); 
      System.out.println("pause"); 
     timeline = new Timeline(new KeyFrame(
      Duration.millis(1000), 
      e -> { 
       openWindow(primaryStage); 
      } 
     )); 
     timeline.setCycleCount(1); 
     timeline.play(); 
     } 
    }); 

终于openWindow方法是什么打开吨1秒后备份:

private void openWindow(Stage primaryStage){ 
    primaryStage.show(); 
    mediaPlayer.play(); 
} 

我遗漏了很多东西,因为我觉得这很不正常。如果你认为你需要更多,我愿意把我的完整代码放在这里,但是这是101行,看起来有点过头了。 我要感谢您对您的帮助提前,我很抱歉,如果这个问题不清楚:我没有真正经历过...... 亲切的问候 Luit意谓

编辑:这里是我完整的代码:

package rickroll; 

    import java.util.ArrayList; 
    import javafx.animation.KeyFrame; 
    import javafx.animation.Timeline; 
    import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.event.EventHandler; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.media.Media; 
import javafx.scene.media.MediaPlayer; 
import javafx.scene.media.MediaPlayer.Status; 
import static javafx.scene.media.MediaPlayer.Status.PLAYING; 
import javafx.scene.media.MediaView; 
import javafx.stage.Screen; 
import javafx.stage.Stage; 
import javafx.stage.WindowEvent; 
import javafx.util.Duration; 

public class Rickroll extends Application { 
    private ArrayList<Stage> stages = new ArrayList<>(); 
    private Group root = new Group(); 
    private MediaPlayer mediaPlayer; 
    private Timeline focusTimer, timeline; 
    private Scene scene; 

    @Override 
    public void start(Stage primaryStage) { 
     Media media = new Media(getClass().getResource("/res/video.mp4").toString()); 
     mediaPlayer = new javafx.scene.media.MediaPlayer(media); 
//  mediaPlayer.setAutoPlay(false); 
     mediaPlayer.setCycleCount(MediaPlayer.INDEFINITE); 
     MediaView mediaView = new MediaView(mediaPlayer); 
     stages.add(primaryStage); 
     primaryStage.setAlwaysOnTop(true); 
     Button button = new Button(); 
     button.addEventHandler(MouseEvent.MOUSE_CLICKED, e -> Platform.exit()); 

     for(int i = 1; Screen.getScreens().size() >= i; i++){ 

     } 

     root.getChildren().add(mediaView); 
     root.getChildren().add(button); 
     scene = new Scene(
      root, 
      Screen.getPrimary().getBounds().getWidth(), 
      Screen.getPrimary().getBounds().getWidth() 
     ); 
     primaryStage.setScene(scene); 
     Platform.setImplicitExit(false); 

     focusTimer = new Timeline(new KeyFrame(
      Duration.millis(500), 
      e -> { 
       primaryStage.requestFocus(); 
       primaryStage.centerOnScreen(); 
       primaryStage.setMaximized(true); 
      } 
     )); 
     focusTimer.setCycleCount(Timeline.INDEFINITE); 
     focusTimer.play(); 

     primaryStage.setTitle("You just got Rick Rolled!"); 
     openWindow(primaryStage); 

     primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() { 
      @Override 
      public void handle(WindowEvent we) { 
      primaryStage.hide(); 
      mediaPlayer.pause(); 
       System.out.println("pause"); 
      timeline = new Timeline(new KeyFrame(
       Duration.millis(1000), 
       e -> { 
        openWindow(primaryStage); 
       } 
      )); 
      timeline.setCycleCount(1); 
      timeline.play(); 
      focusTimer.pause(); 
      } 
     }); 

    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     launch(args); 
    } 

    private void openWindow(Stage primaryStage){ 
     primaryStage.show(); 
     mediaPlayer.play(); 
     System.out.println("play"); 
     focusTimer.play(); 
    } 

} 

正如你将会看到的那样,有一些东西在那里,这个问题是没有关系的。就像在多个屏幕上这样做的开始,以及一个关闭窗口的临时按钮。请忽略那部分。

回答

0

如果问题在于它在您打开/关闭之间暂停,那么因为您的onCloseRequest处理程序中有mediaPlayer.pause()。但是,如果问题是它不会重新开放再次打开,我无法复制它。另外什么是for循环的目的?

+0

我试过了,没用。以下是我的完整代码: – Luit

+0

由于评论太长,我编辑了我的问题。它现在包含完整的代码。我赞成你试图帮助很多!谢谢 – Luit

+0

@Luit更新回答 –

0

检查下面的代码(它包含注释):

import java.net.URISyntaxException; 
import java.util.ArrayList; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

import javafx.animation.KeyFrame; 
import javafx.animation.PauseTransition; 
import javafx.animation.Timeline; 
import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.media.Media; 
import javafx.scene.media.MediaPlayer; 
import javafx.scene.media.MediaView; 
import javafx.stage.Screen; 
import javafx.stage.Stage; 
import javafx.util.Duration; 

public class Rickroll extends Application { 

    private ArrayList<Stage> stages = new ArrayList<>(); 

    private Group    root = new Group(); 
    private Scene    scene; 

    private MediaPlayer   mediaPlayer; 
    private Timeline   focusTimer; 

    @Override 
    public void start(Stage primaryStage) { 

     // Initialise the MediaPlayer 
     Media media = null; 
     try { 
      //change here with your video path 
      media = new Media(getClass().getResource("/videos/video.mp4").toURI().toString()); 
      mediaPlayer = new MediaPlayer(media); 
      mediaPlayer.setCycleCount(MediaPlayer.INDEFINITE); 
      // mediaPlayer.setAutoPlay(false) 
     } catch (URISyntaxException ex) { 
      Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); 
     } 

     // Create the Media View 
     MediaView mediaView = new MediaView(mediaPlayer); 

     // Assuming that you want the Media to have the same size as the window 
     //primaryStage.widthProperty() 
     //  .addListener((observable, oldValue, newValue) -> mediaView.setFitWidth(primaryStage.getWidth())) 

     //primaryStage.heightProperty() 
     //  .addListener((observable, oldValue, newValue) -> mediaView.setFitHeight(primaryStage.getHeight())) 

     // ? 
     stages.add(primaryStage); 

     // PrimaryStage 
     primaryStage.setTitle("You just got Rick Rolled!"); 
     primaryStage.setOnCloseRequest(windowEvent -> { 

      // Hide the stage 
      primaryStage.hide(); 

      // Pause the Media Player 
      mediaPlayer.pause(); 
      System.out.println("pause"); 

      // Use a pause transition to wait 1 second - 1000 milliseconds 
      PauseTransition pause = new PauseTransition(); 
      pause.setDuration(Duration.millis(1000)); 
      pause.play(); 
      pause.setOnFinished(finish -> openWindow(primaryStage)); 

      // Pause the focusTimer 
      focusTimer.pause(); 
     }); 

     // Button 
     Button button = new Button(); 
     button.addEventHandler(MouseEvent.MOUSE_CLICKED, e -> Platform.exit()); 

     // ? you want to know the primary screen size? 
     for (int i = 1; Screen.getScreens().size() >= i; i++) { 

     } 

     // Add the children to the root 
     root.getChildren().addAll(mediaView, button); 
     // Scene 
     scene = new Scene(root, Screen.getPrimary().getBounds().getWidth(), Screen.getPrimary().getBounds().getWidth()); 
     primaryStage.setScene(scene); 
     Platform.setImplicitExit(false); 

     // Focus Timer 
     focusTimer = new Timeline(new KeyFrame(Duration.millis(500), e -> { 
      primaryStage.requestFocus(); 
      primaryStage.centerOnScreen(); 
      primaryStage.setMaximized(true); 
     })); 
     focusTimer.setCycleCount(Timeline.INDEFINITE); 
     focusTimer.play(); 

     // Open the primary stage 
     openWindow(primaryStage); 

    } 

    /** 
    * @param args 
    *   the command line arguments 
    */ 
    public static void main(String[] args) { 
     launch(args); 
    } 

    /** 
    * Open the window and start the player 
    * 
    * @param primaryStage 
    */ 
    private void openWindow(Stage primaryStage) { 

     // Show the primary stage 
     primaryStage.show(); 

     // start the media player 
     mediaPlayer.play(); 
     System.out.println("play"); 

     // start the focusTimer 
     focusTimer.play(); 
    } 

} 
+0

此代码是如此当按下X时,然后程序再次显示,它将继续停止。当屏幕不可见时,我不希望歌曲继续播放。我不完全明白你最后一句话的意思。 – Luit

+0

@Luit编辑已完成.. :) – GOXR3PLUS

+0

但我不希望用户有能力完全退出平台。当按下X时,我希望它等待1秒钟,然后在音乐视频 – Luit

相关问题