【问题标题】:TextInputDialog error文本输入对话框错误
【发布时间】:2018-01-04 15:17:21
【问题描述】:

在 JavaFX 应用程序中显示我的 TextInputDialog 时遇到问题。在代码中:

 TextInputDialog tid = new TextInputDialog("Your name");
    tid.setTitle("Table");
    tid.setHeaderText("You have won!");
    tid.setContentText("Enter your name: ");
    tid.showAndWait();

我遇到了这样的错误:

Exception in thread "Timer-2" java.lang.IllegalStateException: Not on FX application thread; currentThread = Timer-2

是的,我在我的应用程序中使用了三个或四个计时器。

GitHub - https://github.com/verygoodat/FlappyBox /src/Application/GameController/ - 函数 setState(int), switch(2),我应该在游戏中创建一条消息,但我不能。 那么,什么可能导致这个问题呢?


这个Platform.runLater(() -> tid.showAndWait()) 没用

case 2://pause
            TextInputDialog tid = new TextInputDialog("Ваше имя");
            tid.setTitle("Таблица рекордов");
            tid.setHeaderText("Вы побили чей-то рекорд!");
            tid.setContentText("Введите ваше имя: ");
            Platform.runLater(() -> tid.showAndWait());
            Timers.stopTimers();
            pr.setFill(Color.rgb(0,0,0,0.5));
            pr.clearRect(0,0,pre.getWidth(), pre.getHeight()-50);
            pr.fillRect(0,0,pre.getWidth(), pre.getHeight());
            pr.setFill(Color.WHITE);
            stat = "КОНЕЦ ИГРЫ!";
            pr.fillText(stat, WIDTH/2-150, HEIGHT/2);
            pr.fillText( "\nPOINTS: "+gamecontroller.score, WIDTH/2-170, HEIGHT/2);
            gameover = true;
            break;

它是这样工作的:

 Platform.runLater(() ->
            {
                TextInputDialog tid = new TextInputDialog();
                tid.setTitle("Таблица рекордов");
                tid.setHeaderText("Вы побили чей-то рекорд!");
                tid.setContentText("Введите ваше имя: ");
                tid.showAndWait();
            });

【问题讨论】:

  • “是的,我在我的应用程序中使用了三个或四个计时器。” 考虑换成AnimationTimer/a TransitionTimeline,如果你'从这些计时器中重新修改场景。

标签: javafx java-8 javafx-8


【解决方案1】:

在 JavaFX 中,任何更新 UI 的东西都需要在 FX 应用程序线程上运行。你可以在你自己的线程中做任何你想做的事情,使用计时器等,但你应该在应用程序线程上显示 TextInputDialog。

你可以这样做:

Platform.runLater(()->tid.showAndWait());

【讨论】:

  • 那么,我需要为我的 textinputdialog 指定一个线程吗?它不知道它应该在哪里?
  • 它如何“知道它应该在哪里”?它尝试在它所在的线程上执行,在本例中为“Timer-2”,不允许更改 FX 应用程序线程上的内容,这就是出现该错误的原因。
  • 我还有一个问题。在我的普通类(Application/GameController)中,我有这个类的静态实现,并且我有两个或三个变量,它们是从另一个类(如游戏/播放器,函数碰撞,我改变我的生活和得分)修改的这个静态实现。但是在我的 GameController 类中,我不能只说 System.out.print(score)(例如),因为它会写 0,即使不是这样,但 gamecontroller.score 会给出正确的值。这有什么问题?
  • @IlyaFalko 这是另一个问题,应该这样问,cmets 不是问新问题的地方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-04
  • 2015-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多