当前位置: 首页 > 知识库问答 >
问题:

使用线程。在JavaFX中睡眠以获得等待效果[duplicate]

邢弘业
2023-03-14

我想实现这样的事情:用户按下登录按钮,然后标签显示:连接。
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;
    }
}

还有我的LoginViewclass

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个答案

夔建章
2023-03-14

你应该用TimelineAPI制作动画。看看这里:

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

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

另一种方法是进行顺序转换,该转换将有两次0.5秒的暂停转换。

顺便说一句,在你的代码中,你暂停了主用户界面线程,这就是为什么你看不到动画。

柯阳曦
2023-03-14

从不同的线程运行任务<代码>任务允许您在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循环并尝试部分时,单击我的按钮,它的变化非常好… 我怎样才能做到这一点? 问题答案: 在 主 线程中

  • 因此,我理解流畅而明确的等待,但过去我永远无法让隐含的语句起作用。我设法不使用显式词来处理它们,但我随后设计了一个相当简单的测试,但它只适用于线程。睡觉,我绝对讨厌这种方法,并试图不惜一切代价避免它。所以我再次尝试隐式等待函数。。。失败 下面的代码带有线程。睡眠按计划进行,非常好 但当我最终尝试使用隐式(如下面)时,它就不起作用了。我确保在声明驱动程序之后立即声明一次(在本例中为)。考试会在课前的