我想实现这样的事情:用户按下登录按钮,然后标签显示:连接。
0.5秒时间间隔
连接...
0.5秒时间间隔
连接...
等
只是一种视觉效果,表明“引擎盖下”确实发生了什么。
我所得到的并不是我所期望的。我点击按钮,等待1.5秒,然后我得到了“连接…”,缺少前面的两个步骤。
首先,我的状态
类
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
class
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();
}
});
}
你应该用Timeline
API制作动画。看看这里:
https://docs.oracle.com/javase/8/javafx/api/javafx/animation/Timeline.html
基本上,您只需在0.5秒的距离定义KeyFrame
s,并设置文本的值以添加另一个点。您也可以让它无限重复,直到连接建立,以获得循环动画。
另一种方法是进行顺序转换
,该转换将有两次0.5秒的暂停转换。
顺便说一句,在你的代码中,你暂停了主用户界面线程,这就是为什么你看不到动画。
从不同的线程运行任务
<代码>任务允许您在JavaFX应用程序线程上更新它的消息
属性,该属性应用于更新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();
我正在编写一个基于await/sleep范式的网络绑定应用程序。 我更喜欢这样一个答案,不创建任何额外的线程
这里的要点是了解实现等待循环的更有效的解决方案,该循环在每次迭代时轮询条件。通过高效,我的意思是“有效的CPU调度”。 我知道代码中使用的等待条件不是“wakeOne”/“wakeAll”指令中使用的“真正的等待条件”,但我想知道对CPU来说,使用假等待条件是否比睡眠更有效。 这里有2个代码片段,它们做同样的事情:等待某些事情发生。这段代码用于工作线程池。因此,当一个线程等待时,其他线程(或其他一
上面的代码工作得很好,但如果我使用wait而不是thread。sleep I get StaleElementReferenceException异常。这是我使用的流畅等待: 这将找到combobox,但再次对combobox执行任何操作将导致NoTouchElement或statestate异常。所以我也尝试了从combobox中选择值: 这超时和doesnot工作! 我如何才能使这项工作,为什
首先,我没有问与C#相同的问题-线程的替代品。睡眠?,或线程的替代品。睡在C#?。我不认为我使用它是错误的,需要一个真正的替代特定的情况。 在一次代码分析运行中,我看到了一个令人惊讶的违规行为: 线程的用法。睡眠()是设计缺陷的标志。 这一违规行为导致彼得·里奇(Peter Richie)撰写了一篇文章,阐述了为什么这构成了糟糕的设计。 我们都知道线程创建是昂贵的,线程阻塞意味着池中的争用。我们还
问题内容: 我正在使用JLabel创建动画, 我有一个按钮可以更新标签 但是,我不知道如何等待(例如1000毫秒)直到下一次更改。当我添加此: 到我的ActionListener中: 它不起作用。它停了片刻,我看不到第一帧和最后一帧之间的变化。是否可以等待1000毫秒而不停止程序?当我删除while循环并尝试部分时,单击我的按钮,它的变化非常好… 我怎样才能做到这一点? 问题答案: 在 主 线程中
因此,我理解流畅而明确的等待,但过去我永远无法让隐含的语句起作用。我设法不使用显式词来处理它们,但我随后设计了一个相当简单的测试,但它只适用于线程。睡觉,我绝对讨厌这种方法,并试图不惜一切代价避免它。所以我再次尝试隐式等待函数。。。失败 下面的代码带有线程。睡眠按计划进行,非常好 但当我最终尝试使用隐式(如下面)时,它就不起作用了。我确保在声明驱动程序之后立即声明一次(在本例中为)。考试会在课前的