我和我的朋友正在编写一个用于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();
}
}
正如你将会看到的那样,有一些东西在那里,这个问题是没有关系的。就像在多个屏幕上这样做的开始,以及一个关闭窗口的临时按钮。请忽略那部分。
我试过了,没用。以下是我的完整代码: – Luit
由于评论太长,我编辑了我的问题。它现在包含完整的代码。我赞成你试图帮助很多!谢谢 – Luit
@Luit更新回答 –