无法在JFoenix中更新JFXSpinner可见性

时间:2017-05-10 00:17:10

标签: java javafx jfoenix

我有一个简单的登录窗口,我想在发送登录请求时显示JFXSpinner(如加载程序)。为此,我创建了一个JFXSpinner对象,最初我将其设置为不可见(将可见性值设置为false),当用户单击LOGIN按钮时,我想在发送请求之前显示微调器并在完成请求后再次隐藏它。 问题是:我无法显示我的JFXSpinner。有人可以帮我吗?

这是我的登录方法

    //loader : is my JFXSpinner object
public void login(ActionEvent event)
{
    Task task = new javafx.concurrent.Task<Void>()
    {
            @Override
            protected Void call() throws Exception 
            {
                loader.setVisible(true);
                if(Compte.login(username.getText(), password.getText()))
                {
                    System.err.println("It's okey");
                }
                else
                {
                    //TODO
                }
                loader.setVisible(false);
                return null;
            }

            @Override
            protected void succeeded() 
            {
                loader.setVisible(false);
            }

            @Override
            protected void failed() 
            {
                loader.setVisible(false);
            }
    };
    Thread thread = new Thread(task, "My Task");
    thread.setDaemon(true);
    thread.start();
}

1 个答案:

答案 0 :(得分:1)

您无法从后台线程修改UI,这是您尝试调用

时发生的情况
loader.setVisible(true);

在任务的call()方法中。

相反,您应该在开始任务之前立即从FX应用程序线程进行调用:

public void login(ActionEvent event) {
    Task task = new javafx.concurrent.Task<Void>() {

        @Override
        protected Void call() throws Exception  {
            if(Compte.login(username.getText(), password.getText())) {
                System.err.println("It's okey");
            } else {
                //TODO
            }
            return null;
        }

        @Override
        protected void succeeded() {
            loader.setVisible(false);
        }

        @Override
        protected void failed() {
            loader.setVisible(false);
        }

    };
    Thread thread = new Thread(task, "My Task");
    thread.setDaemon(true);
    loader.setVisible(true);
    thread.start();
}