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();
}
}});
}
}
所以我得到了一项任务,让我的应用程序通过使用 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();
}
}});
}
}