使用Thread.sleep在JavaFX中获得等待效果

时间:2018-02-03 13:59:58

标签: multithreading javafx

我想实现这样的目标:用户按下登录按钮然后标签显示: “连接”。
0.5秒时间间隔
“连接......”
0.5秒时间间隔
“连接......”

只是一种视觉效果,表明事物实际上正在“引擎盖下”。

我设法得到的并不是我所期待的。我点击按钮,等待1.5秒,然后我得到“正在连接...”,缺少前两个步骤。

首先,我的Status班级

public class Status {
    private static StringProperty status = new SimpleStringProperty();

    public static void setStatus(String newStatus) {
        status.setValue(newStatus);
    }

    public static String getStatus() {
        return status.getValue();
    }

    public static StringProperty get() {
        return status;
    }
}

和我的LoginView班级

public class LoginView extends Application {

   private Button loginButton = new Button("Log in");
   private Label statusLabel;

   private void createLabels() {        
      statusLabel = new Label(Status.getStatus());
      statusLabel.textProperty().bind(Status.get());
   }

}  

 private void createButtons() {        
        loginButton.setOnAction(e -> {
            try {
                Status.setStatus("Connecting.");
                Thread.sleep(500);
                Status.setStatus("Connecting..");
                Thread.sleep(500);
                Status.setStatus("Connecting...");
                Thread.sleep(500);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
        });
    }

2 个答案:

答案 0 :(得分:2)

从其他线程运行TaskTask允许您更新JavaFX应用程序线程上的message属性,该属性应该用于更新GUI,并且不能被长时间运行的任务阻止,因为它负责呈现:

Task<Void> task = new Task<Void>() {

    @Override
    protected Void call() throws InterruptedException {
        updateMessage("Connecting.");
        Thread.sleep(500);
        updateMessage("Connecting..");
        Thread.sleep(500);
        updateMessage("Connecting...");
        Thread.sleep(500);

        return null;
    }

};

// bind status to task's message
Status.get().bind(task.messageProperty());

// run task on different thread
new Thread(task).start();

答案 1 :(得分:1)

您应该使用Timeline API制作动画。看看这里:

https://docs.oracle.com/javase/8/javafx/api/javafx/animation/Timeline.html

基本上你只需要在0.5秒距离定义KeyFrame s并设置文本的值以添加另一个点。您还可以使其无限重复,直到建立连接以获得循环动画。

另一种方法是制作SequentialTransition,其中PauseTransitions的两个public static readonly RoutedEvent SearchEvent = EventManager.RegisterRoutedEvent( "Search", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(AdvComboBox)); // Provide CLR accessors for the event public event RoutedEventHandler Search { add { AddHandler(SearchEvent , value); } remove { RemoveHandler(SearchEvent, value); } } 为0.5秒。

BTW在您的代码中暂停主UI线程,这就是您无法看到动画的原因。