JavaFX,命令顺序(貌似)被忽略了

时间:2014-08-18 13:04:26

标签: java javafx label sequence

我在java1.7下使用JavaFX进行编程,除了这部分外,一切都适用于我的代码。问题是,只有最终结果被写出来。程序运行时,我希望它显示" 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 个答案:

答案 0 :(得分:1)

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

为了解决这个问题,您需要在单独的线程上执行长时间运行的代码,以避免阻止重新绘制GUI。请查看Concurrency in JavaFX,了解有关如何实施该功能的详细信息。