JavaFX 不在 FX 应用程序线程上

JavaFX not on FX application thread

所以我得到了一项任务,让我的应用程序通过使用 Runnable 的多线程每 x 秒检查一次客户。因此,我将 ScheduledExecutorService 塞进了我的控制器 class,然后调用了新线程,这一切都很棒,但是每当我尝试发出警报时,我都会收到 IllegalStateException。

class:

public class Line implements Runnable
{

    public Line()
    {
        System.out.println("I'm made");
    }

    @Override
    public void run()
    {
        System.out.println("I've started");
        try
        {
            Alert alert = new Alert(AlertType.ERROR, "Line is empty");
            alert.setTitle("Error");
            alert.setHeaderText("Line empty");
            System.out.println("I've ended");
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

我试过将整个 运行() 函数放入 Platform.runLater 中,如下所示:

Platform.runLater(new Runnable() {
          @Override
            public void run()
            {
                System.out.println("I've started");
                try
                {
                    Alert alert = new Alert(AlertType.ERROR, "Line is empty");
                    alert.setTitle("Error");
                    alert.setHeaderText("Line empty");
                    System.out.println("I've ended");
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        });

但是 Runnable 抱怨没有 运行()。

有人知道怎么做吗?必须通过 ScheduledExecutorService 每 x 秒调用一次代码,并且必须在 运行() 函数内发出警报。

您在两个不同的 Runnable 之间感到困惑。您的 Line 实现了 Runnable ,因此必须实现 run ,它将由调度程序执行。但是如果你想将 UI 工作返回到 FX 线程,你需要将它传递给另一个 Runnable 实现,a la:

 public class Line implements Runnable
    {

        public Line()
        {
            System.out.println("I'm made");
        }

    @Override
    public void run()
    {
      Platform.runLater(new Runnable() {
            @Override
            public void run()
            {
              System.out.println("I've started");
              try
              {
                 Alert alert = new Alert(AlertType.ERROR, "Line is empty");
                 alert.setTitle("Error");
                 alert.setHeaderText("Line empty");
                 System.out.println("I've ended");
              } catch (Exception e) {
                e.printStackTrace();
              }
          }});
     }
}