【问题标题】:JavaFX and ProgressIndicator with fxml带有 fxml 的 JavaFX 和 ProgressIndicator
【发布时间】:2017-11-08 17:40:39
【问题描述】:

我从早上开始就想知道如何解决这个问题。我有登录应用程序。当用户等待登录时,我想使用 processindicator。我使用了第二个线程,但它不起作用

主加载器 fxml

主控制器

@FXML public StackPane MainStackPane;

    public void initialize(URL arg0, ResourceBundle arg1) {

    FXMLLoader loader = new FXMLLoader(this.getClass().getResource("/LoginForm/Login.fxml"));
    Pane pane = null;

    try {
        pane = loader.load();
    } catch (IOException e) {System.out.println(e.getMessage());}

    LoginController login = loader.getController();
    login.setMainController(this);

    setScreen(pane, true);
}

public void setScreen(Pane pane, boolean clean){

    MainStackPane.getChildren().addAll(pane);
    }

登录表单:

private MainController mainController;
private void Zaloguj() throws IOException {
    String cryptUser = null, cryptPass = null;

    Test test = new Test(this.mainController);
    test.start();

    try {
        Thread.sleep(5000);
    } catch (InterruptedException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    LoginSQL sql = new LoginSQL();`
    Byte LoginResult = sql.SQLselect(cryptUser, cryptPass);

    ...}

课堂测试

public class test extends Service<Void>{

private MainController mainController;

public test(MainController mainController) {
    this.mainController = mainController;
}

protected Task<Void> createTask() {
    return new Task<Void>() {
        @Override
        protected Void call() throws Exception {
            System.out.println("Service: START");

            ProgressIndicator p = new ProgressIndicator(); 

                     Platform.runLater(new Runnable() {
                         @Override public void run() {

                    mainController.MainStackPane.getChildren().addAll(p);
                     }});

                if (isCancelled()) {
                    mainController.MainStackPane.getChildren().remove(p);
                }
                return null;
            };};}}  

ProgressIndicator 仅在登录后出现在下一个窗口中。怎么办?

【问题讨论】:

    标签: java javafx


    【解决方案1】:

    JavaFX 渲染只发生在主线程中。如果您添加ProgressIndicator,然后使用Thread.sleep(),JavaFX 将在Thread.sleep() 完成之前呈现指标。另外,如果登录请求挂起,JavaFX 也会等到登录请求完成后再进行渲染。

    你要做的是确保永远不会中断/挂起主线程。删除Thread.sleep,并将您的登录请求移至子线程。当请求完成后,通知主线程,以便它可以删除ProgressIndicator

    【讨论】:

    • 非常感谢您的建议。我将登录名移至新线程并删除了睡眠。这是一个问题,因为线程是在方法“Zaloguj”中执行了整个代码之后启动的。正确登录后加载窗口的代码应该放在哪里?
    • 好的,完成! :) 在方法 Zaloguj 中:.runningProperty().addListener(event ->{ FXMLLoader ....
    猜你喜欢
    • 1970-01-01
    • 2018-04-06
    • 2019-10-27
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 2013-01-12
    相关资源
    最近更新 更多