java—使用javafx创建一个从一个数字开始倒计时并在0处播放音乐的程序

pu3pd22g  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(481)

尝试创建一个程序,该程序显示一个窗格,用户在其中输入一个数字并按enter键。
然后程序应该每隔一秒钟从这个数字开始倒计时。
一旦计数器达到0,它应该播放一个声音。
我很难让我的程序正常工作,也不能完全确定我把事情搞砸了,或者我做错了什么。
所以理论上,如果用户输入“30”,它应该开始倒计时到0,每次减去1。29 ... 28 ... 27 ... 等
这是我的密码:

  1. public class Counter extends Application {
  2. private static final String MEDIA_URL = "http://cs.armstrong.edu/liang/common/sample.mp4";
  3. private TextField text = new TextField();
  4. int countDown = Integer.parseInt(text.getText());
  5. @Override
  6. public void start(Stage primaryStage) {
  7. Media media = new Media(MEDIA_URL);
  8. MediaPlayer mediaPlayer = new MediaPlayer(media);
  9. // create a pane and add a TextField
  10. BorderPane pane = new BorderPane();
  11. pane.setCenter(text);
  12. text.setFont(Font.font("Times", 35));
  13. // create a new animation
  14. Timeline animation = new Timeline(
  15. new KeyFrame(Duration.millis(1000), e -> {
  16. if (countDown > 0) {
  17. countDown--;
  18. text.setText(Integer.toString(countDown));
  19. }
  20. else {
  21. mediaPlayer.play();
  22. }
  23. }));
  24. animation.setCycleCount(Timeline.INDEFINITE);
  25. // create and register a handler
  26. text.setOnAction(e -> text.setText(text.getText()));
  27. text.setOnAction(e -> animation.play());
  28. // create a scene and place it in the stage
  29. Scene scene = new Scene(pane);
  30. primaryStage.setScene(scene);
  31. primaryStage.show();
  32. }
  33. public static void main(String args[]) {
  34. Application.launch(args);
  35. }
  36. }

编辑:运行时,我得到一长串错误:

  1. Exception in Application constructor
  2. java.lang.reflect.InvocationTargetException
  3. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  4. at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
  5. at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
  6. at java.lang.reflect.Method.invoke(Unknown Source)
  7. at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(Unknown Source)
  8. at com.sun.javafx.application.LauncherImpl.launchApplication(Unknown Source)
  9. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  10. at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
  11. at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
  12. at java.lang.reflect.Method.invoke(Unknown Source)
  13. at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
  14. Caused by: java.lang.RuntimeException: Unable to construct Application instance: class Counter
  15. at com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown Source)
  16. at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(Unknown Source)
  17. at java.lang.Thread.run(Unknown Source)
  18. Caused by: java.lang.reflect.InvocationTargetException
  19. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
  20. at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
  21. at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
  22. at java.lang.reflect.Constructor.newInstance(Unknown Source)
  23. at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(Unknown Source)
  24. at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(Unknown Source)
  25. at com.sun.javafx.application.PlatformImpl.lambda$null$173(Unknown Source)
  26. at java.security.AccessController.doPrivileged(Native Method)
  27. at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(Unknown Source)
  28. at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
  29. at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
  30. at com.sun.glass.ui.win.WinApplication.lambda$null$148(Unknown Source)
  31. ... 1 more
  32. Caused by: java.lang.NumberFormatException: For input string: ""
  33. at java.lang.NumberFormatException.forInputString(Unknown Source)
  34. at java.lang.Integer.parseInt(Unknown Source)
  35. at java.lang.Integer.parseInt(Unknown Source)
  36. at Counter.<init>(Counter.java:18)
  37. ... 13 more
  38. Exception running application Counter
rdlzhqv9

rdlzhqv91#

代码中有几个错误:
您正在读取文本字段和设置 countDown 立即,即在用户输入任何内容之前。当用户对文本字段执行操作时,需要读取文本。
您正在将动画的循环计数设置为 INDEFINITE 而不是 countDown 设置一次循环计数,而不是在用户提交文本字段时设置
你在设置 onAction 按钮的属性两次。 onAction 只是一个属性,就像其他属性一样:如果您设置它,然后再次设置它,它将只保存第二个值,即对的第一个调用 textField.setOnAction(...) 不会有任何影响。
文本字段上的第一个操作处理程序不会执行任何操作:它将文本字段的文本设置为文本字段的当前文本。
你需要这样的东西:

  1. import javafx.animation.KeyFrame;
  2. import javafx.animation.Timeline;
  3. import javafx.application.Application;
  4. import javafx.scene.Scene;
  5. import javafx.scene.control.TextField;
  6. import javafx.scene.layout.BorderPane;
  7. import javafx.scene.media.Media;
  8. import javafx.scene.media.MediaPlayer;
  9. import javafx.scene.text.Font;
  10. import javafx.stage.Stage;
  11. import javafx.util.Duration;
  12. public class Counter extends Application {
  13. private static final String MEDIA_URL = "http://cs.armstrong.edu/liang/common/sample.mp4";
  14. private TextField text = new TextField();
  15. int countDown;
  16. @Override
  17. public void start(Stage primaryStage) {
  18. Media media = new Media(MEDIA_URL);
  19. MediaPlayer mediaPlayer = new MediaPlayer(media);
  20. // create a pane and add a TextField
  21. BorderPane pane = new BorderPane();
  22. pane.setCenter(text);
  23. text.setFont(Font.font("Times", 35));
  24. // create a new animation
  25. Timeline animation = new Timeline(new KeyFrame(Duration.millis(1000), e -> {
  26. if (countDown > 0) {
  27. countDown--;
  28. text.setText(Integer.toString(countDown));
  29. } else {
  30. mediaPlayer.play();
  31. }
  32. }));
  33. // create and register a handler
  34. // text.setOnAction(e -> text.setText(text.getText()));
  35. text.setOnAction(e -> {
  36. countDown = Integer.parseInt(text.getText());
  37. animation.setCycleCount(countDown + 1);
  38. animation.play();
  39. });
  40. // create a scene and place it in the stage
  41. Scene scene = new Scene(pane);
  42. primaryStage.setScene(scene);
  43. primaryStage.show();
  44. }
  45. public static void main(String args[]) {
  46. Application.launch(args);
  47. }
  48. }

您可能还需要解决一些其他问题(例如,如果用户在动画进行过程中对文本字段执行操作,会发生什么情况等),但这至少会让它“工作”。

展开查看全部

相关问题