JavaFx对EDT的回答?

JavaFx对EDT的回答?,java,multithreading,javafx-2,scenebuilder,Java,Multithreading,Javafx 2,Scenebuilder,我问了一个关于在GUI中使用线程的问题,得到了以下回答: 你必须修改你的程序 GUI元素应在GUI线程(EDT)内更新 仅限于,而不是来自独立线程 客户端连接应分为两个弱连接部分: 发送和接收消息。接收应该是一个单独的过程 线程,发送可以是线程或类 接收线程读取消息后,将其发送到EDT 使用SwingUtilities.invokeLater(Runnable)。可以找到一些例子 其他地方 当用户输入文本时,文本被发送到套接字 直接,或在队列中排队,然后由发送 线程,如果有的话 我想知道的是Ja

我问了一个关于在GUI中使用线程的问题,得到了以下回答:

你必须修改你的程序

  • GUI元素应在GUI线程(EDT)内更新 仅限于,而不是来自独立线程
  • 客户端连接应分为两个弱连接部分: 发送和接收消息。接收应该是一个单独的过程 线程,发送可以是线程或类
  • 接收线程读取消息后,将其发送到EDT 使用SwingUtilities.invokeLater(Runnable)。可以找到一些例子 其他地方
  • 当用户输入文本时,文本被发送到套接字 直接,或在队列中排队,然后由发送 线程,如果有的话
  • 我想知道的是JavaFx对EDT的响应是什么,有人能举个例子说明如何使用它吗

    我的第一篇文章可以在这个链接上找到

    • 请注意,如果重要的话,我已经在javaFx场景生成器中构建了GUI

    就我个人而言,我只是覆盖了任务的run方法,以使内核保持忙碌并完成任务。非可视任务通过扩展服务类来完成。JavaFX应用程序线程专门用于调用服务上的所有方法和状态

    服务是封装信息的非可视组件 需要在一个或多个后台线程上执行某些工作

    任务是未来任务的完全可观察的实现。任务 公开对以下内容有用的其他状态和可观察属性: 按照Worker中的定义,在JavaFX中编程异步任务 接口

    非UI计算(如发送消息)应该通过运行任务在单独的线程中进行。当使用JavaFX应用程序线程(与EDT相同)的
    Platform.runLater(java.lang.Runnable-Runnable)
    接收消息时,您可以更改UI(显示消息),但这会使UI滞后,因此最好从单独的线程执行密集型操作

    因此,您可以通过调用
    newthread(task).start()来定义任务并触发新线程。在Task anonymous类中,可以添加一个侦听器,在收到消息时更新UI。一个任务可以包含以下内容,您可以监听它们

    使用来自和使用stateProperty侦听器的任务的示例代码

    Task task = new Task<Void>() {
        @Override public Void run() {
            static final int max = 1000000;
            for (int i=1; i<=max; i++) {
                updateProgress(i, max);
            }
            return null;
        }
    };
    ProgressBar bar = new ProgressBar();
    bar.progressProperty().bind(task.progressProperty());
    new Thread(task).start();
    
    Task Task=新任务(){
    @重写公共无效运行(){
    静态最终整数最大值=1000000;
    
    对于(inti=1;i您是否在JavaFX中查找对应的SwingUtil.invokeLater。如果是,则为 Platform.runLater(java.lang.Runnable)

    引用API

    在某个时间在JavaFX应用程序线程上运行指定的Runnable 未指定未来的时间


    我如何知道何时运行任务?我目前正在创建一个任务程序,并且我只需要在一个或多个聊天人员出现问题时更新gui,例如聊天文本,或者如果有新人连接到聊天室,我指的是聊天程序(抱歉,键入错误).好的,让我直说吧!我创建了一个名为client listner的新类,它扩展了线程,然后在我的gui controllere中创建了一个任务,并将其作为参数传递给我的线程??或者它如何工作?我使用Smack API在Eclipse中传递消息和构建双曲线。在您的控制器中,建立连接,为TA定义一个匿名类k、 通过如下方式添加PacketListener代码来重写其运行方法-
    if(connection!=null){PacketListener=new PacketListener(){public void processPacket(Packet Packet){Message Message Message=(Message)Packet Packet Packet;if(Message.getType()==Message.Type.chat)startChat(Message);}};PacketFilter=new PacketTypeFilter(Message.class);connection.addPacketListener(listener,filter);}
    并调用
    新线程(task.start();
    。我真的很高兴您的回复:)并感谢您的帮助。我可以通过skype向您寻求帮助吗?这样我就知道我走在正确的轨道上了?:)会帮我很多忙的!
    task.stateProperty().addListener(new ChangeListener<Worker.State>() {
    
            @Override
            public void changed(ObservableValue<? extends State> observable,
                    State oldValue, Worker.State newState) {
                if(newState==Worker.State.SUCCEEDED){
                    //doSomething()
                }
            }
        });