我想实现这样的目标:用户按下登录按钮然后标签显示:
“连接”。
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();
}
});
}
答案 0 :(得分:2)
从其他线程运行Task
。 Task
允许您更新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线程,这就是您无法看到动画的原因。