首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javafx,组织线程

问Javafx,组织线程
EN

Stack Overflow用户
提问于 2014-08-21 14:18:40
回答 2查看 95关注 0票数 0

我正在用JavaFXJava1.7编程,我需要帮助解决线程问题。我所需要的只是让我的程序写出“ping”,同时它得到设备的IP并点击它。问题是,如果我把这两个线程放在一个线程中,而不是只执行第一个线程。如果我只将其中一个放在线程中,而不是在线程中执行的话。对于如何运行第一个线程,有比第二个线程更好的方法吗?或者任何其他的方法来获得“Ping”文本写出来的Ping标签,而程序得到的ip和点击它?

代码语言:javascript
复制
@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 = "Pinging";
        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();
    }

谢谢你的时间:) PS:是的,这是我第一次尝试使用线程,我已经尝试了3-4天了.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-21 17:08:12

这件事在其他地方都很好,但是.关于JavaFX应用程序中的线程,需要了解的两件最重要的事情是:

  1. 任何长时间运行的代码都应该在FX应用程序线程上执行。
  2. 对UI 的任何更改都必须在上执行

Task类是Runnable的一个实现(因此它可以传递给Threads),它为在implementation线程上更新UI提供了各种挂钩。爪哇有很多清晰的例子。

在特定情况下,第一个Task是多余的。它所做的唯一的事情就是更新UI (所以它不能在后台线程中执行),而且其中没有需要很长时间执行的代码。因此,这应该直接在FX应用程序线程中执行。

第二个Task执行一个长时间的调用来查找String,并且使用String来更新UI。因此,应该将其声明为Task<String>,其调用方法将返回String。当调用完成时,可以使用onSucceeded处理程序更新UI:

代码语言:javascript
复制
@FXML
private void ciscoButton(ActionEvent event) throws IOException {
    CiscoPing.setWrapText(true);
    String text1;
    text1 = "Pinging";
    Ping.setWrapText(true);
    Ping.setText(text1);

    final Task<String> task = new Task<String>() {
        @Override 
        public String call() throws IOException {
            String text2 = PingIp.PingEtherAddr(GetIp.retIpEther()).toString();
            return text2.substring(1, (text2.length() - 1));
        }
    };

    task.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
        @Override
        public void handle(WorkerStateEvent event) {
            Ping.setWrapText(true);
            String text = task.getValue(); // value returned from call()
            Ping.setText(text);
        }
    });
    new Thread(task).start();
}
票数 1
EN

Stack Overflow用户

发布于 2014-08-21 17:09:33

我终于找到了一个解决方案,它确实解决了我想要的,但它不会使它成为多线程代码。

代码语言:javascript
复制
@FXML
private void Button(ActionEvent event) throws IOException {
    Ping.setWrapText(true);
    Task<Void> task2 = new Task<Void>() {
        @Override
        public Void call() throws IOException {
            updateMessage("Pinging");
            PingIp.PingIp(GetIp.retIp()).toString();
            text2 = text2.substring(1, (text2.length() - 1));
            updateMessage(text2);
            return null;
        }
    };

    Ping.textProperty().bind(task2.messageProperty());
    new Thread(task2).start();
}

谢谢你的帮助,但是^^作为“可能的复制”发布的Libk给了我一个尝试这个的想法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25428762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档