有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JavaFX,命令顺序(似乎)被忽略

我在java1下用JavaFX编程。7,除此部分外,所有内容都与我的代码兼容。问题是,只有最终结果会被写出来。当程序运行时,我希望它在标签中显示“Ping测试正在运行”文本。但它不会这样做,而是等待几秒钟(直到ping结束),然后写出ping的结果。这看起来很糟糕,因为在3-4秒内什么都没有发生,用户可能会认为它冻结了或其他什么。。。因此,我想写下这条信息。 那么,有人能告诉我为什么会发生这种情况以及如何解决它吗?谢谢你抽出时间。 PS:是的,它需要在PingIp(...)中等待几秒钟,这样我才能正确地读取所需的信息,否则我将得到空指针错误

@FXML
private Label Ping;

@FXML
    private void Button(ActionEvent event) throws IOException {
        String text;
        Ping.setWrapText(true);
        Ping.setText("Ping test is running");
        text = PingIp.PingWifiAddr(GetIp.retIpWifi()).toString();
        text = text.substring(1, (text.length()-1));
        TeltonikaPing.setWrapText(true);
        TeltonikaPing.setText(text);
    }

下面是编辑的部分

@FXML
    private void ciscoButton(ActionEvent event) throws IOException {
        CiscoPing.setWrapText(true);
        Task<Void> task1 = new Task<Void>() {
            @Override public Void call() throws IOException {
        String text1;
        text1 = "Ping teszt folyamatban";
        Ping.setWrapText(true);
                Ping.setText(text1);
                return null;

    }
};
new Thread(task1).start();

        Task<Void> task = new Task<Void>() {
            @Override public Void call() throws IOException {
                String text2 = PingIp.PingEtherAddr(GetIp.retIpEther()).toString();
                text2 = text2.substring(1, (text2.length() - 1));
                Ping.setWrapText(true);
                Ping.setText(text2);
                return null;
            }
        };
        new Thread(task).start();
    }

以上是经过编辑的,有什么想法吗


共 (1) 个答案

  1. # 1 楼答案

    原因是您正在JavaFX应用程序线程上完成所有工作。当您在JavaFX应用程序线程上设置一些属性(如标签的文本)时,结果不会立即显示。相反,它会等到代码运行完毕,此时框架会再次接管并显示您的更改

    为了避免这种情况,您需要在单独的线程上执行长时间运行的代码,以避免阻止GUI的重新绘制。看看Concurrency in JavaFX了解如何实现这一点的详细信息