我完全知道已经有人问过这个问题,但是我的问题在于如何调用该特定函数。 因此,让我介绍一个主要问题:我必须创建一个日志以将客户添加到队列中。
为了解决这个问题,我尝试了具有可运行对象和Platform.runLater(...)的方法的多个版本,但是它仅在过程完成后才更新日志。由于这些方法已经为其他人使用,因此我开始认为我在错误地使用它们。这是我写的:
这是我声明UI的地方,我在其中使用了
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
Scheduler.border.setCenter(Scheduler.scroll);
Scene scene = new Scene(Scheduler.border, 800, 600);
primaryStage.setScene(scene);
primaryStage.show();
Scheduler scheduler = new Scheduler();
scheduler.run();
}
public static void main(String[] args) {
launch(args);
}
}
可运行类。它每秒钟在控制台中显示一次,并在10秒后显示gui。第二种方法是应该解决我的问题的方法:制作FX线程以允许我更改UI。确实如此,但是在错误的时间。
class Scheduler implements Runnable{
private static final int numberQueues = 3;
static final int serviceTime = 10;
static volatile int currentTime;
public static BorderPane border = new BorderPane();
public static Pane scroll = new Pane();
public static TextArea logList = new TextArea(" Starting Logs...\n");
public Scheduler() {currentTime = 0;}
@Override
public void run() {
while (serviceTime > currentTime) {
currentTime += 1;
try {
writeToActivityLog(currentTime + " | Customer at queue" + currentTime % numberQueues);
System.out.println(currentTime + " | Customer at queue" + currentTime % numberQueues);
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
static public void writeToActivityLog(String logEntry){
class Threade implements Runnable {
private String logEntry;
private Threade(String logEntry){
this.logEntry = logEntry;
}
@Override
public void run() {
logList.appendText(logEntry);
scroll.getChildren().removeAll();
scroll.getChildren().addAll(logList);
}
}
String updatedLog = logList.getText()+ logEntry;
Threade thread = new Threade(updatedLog);
Platform.runLater(thread);
}
}
因此,如前所述,我希望不仅在线程完成之后,还可以在线程运行时生成日志。但这是我可以获得它们的唯一方法。另外,该窗口会冻结在线程过程中单击的窗口,但是在线程完成运行之后就可以了。