2016-11-08 1 views
1

나와 저의 친구는 사람들을 리크 롤하는 데 사용되는 작은 javafx 8 프로그램을 작성하고 있습니다. 일단 그것을 열면, 닫으려고하면 다시 돌아오고 끌고 나갈 수도 있습니다. 한 가지 문제가 있습니다. 일단 프로그램을 시작한 다음 종료하면 1 초 후에 다시 열립니다. 그러나 미디어 플레이어가 멈추고 이유를 파악할 수 없습니다. 편집 : 미디어 플레이어가 다시 열릴 때 즉시 멈추지 않습니다. 다시 열면 1 초 후에 멈 춥니 다. 그래서 다시 열리고 잘 돌아갑니다. 그러나 기다리면 다시 열면 1 초 동안 그대로두면 얼 수 있습니다.javafx 장면을 닫았다가 다시 열면 내 미디어 플레이어가 정지합니다.

윈도우가 닫혀
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 방법

이것은 MediaPlayer가 생성되는 경우 어떻게 1 초 후에 모든 것을 백업하는 것이 무엇입니까?

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

나는 그것이 비현실적이라고 느꼈기 때문에 내가 빠뜨린 것들이 꽤있다. 당신이 더 필요하다고 생각한다면 여기에 전체 코드를 기꺼이 달아 주겠다.하지만 그것은 101 줄 길다. 내가 사전에 도와 주셔서 감사드립니다, 그리고 질문이 불분명하면 미안 해요 : 정말 경험이 아니에요 ... 종류 Luit MEINEN

에게

편집에 관하여 : 여기 내 전체 코드입니다 :

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

댓글이 너무 길어서 제 질문을 수정했습니다. 이제 완전한 코드를 제공합니다. 나는 너를 많이 돕기 위해 애 쓰고있다. thanks – Luit

+0

@Luit Updated Answer –

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

관련 문제