JavaFx Ответ на EDT?

Я задал вопрос об использовании потоков в графическом интерфейсе и получил следующий ответ:

Вы должны переработать свою программу.

  1. Элементы GUI следует обновлять только из потока GUI (EDT), а не из отдельного потока.
  2. Клиентское соединение должно быть разделено на 2 слабо связанные части: отправка сообщений и их получение. Получение должно быть отдельным потоком, а отправка может быть потоком или классом.
  3. Когда принимающий поток прочитал сообщение, он отправляет его в EDT с помощью SwingUtilities.invokeLater(Runnable). Примеры можно найти в другом месте.
  4. Когда пользователь вводит текст, текст отправляется в сокет напрямую или ставится в очередь в очередь, а затем обрабатывается отправляющим потоком, если таковой имеется.

Я хочу знать, что такое ответ JavaFx на EDT, и может ли кто-нибудь привести пример того, как его использовать?

Мой первый пост можно найти по этой ссылке Серверная/клиентская программа перестает работать после Тема начинается

  • Обратите внимание, если это имеет значение, я создал свой графический интерфейс в построителе сцен javaFx.

person Marc Rasmussen    schedule 14.10.2012    source источник


Ответы (2)


Лично я просто переопределяю метод run Task, чтобы ядра оставались занятыми и выполняли свою работу. Невизуальные задачи выполняются путем расширения класса Service. Поток приложения JavaFX используется исключительно для вызова всех методов и состояний Service.

Служба — это невизуальный компонент, инкапсулирующий информацию, необходимую для выполнения некоторой работы в одном или нескольких фоновых потоках.

Задача — это полностью наблюдаемая реализация FutureTask. Задачи предоставляют дополнительные состояния и наблюдаемые свойства, полезные для программирования асинхронных задач в JavaFX, как определено в интерфейсе Worker.

Вычисления, не связанные с пользовательским интерфейсом, такие как отправка сообщений, должны выполняться в отдельном потоке путем запуска задачи. Вы можете изменить пользовательский интерфейс (отобразить сообщение), когда сообщения получены с помощью Platform.runLater(java.lang.Runnable runnable) из потока приложения JavaFX (такого же, как EDT), но это может сделать пользовательский интерфейс медленным, поэтому предпочтительнее выполнять интенсивные действия из отдельных потоков.

Таким образом, вы можете определить задачу и запустить новый поток, вызвав new Thread(task).start();. В анонимном классе Task вы можете добавить прослушиватель, который обновляет пользовательский интерфейс при получении сообщения. Задача может иметь следующие WorkerStateEvent и вы можете слушать их.

Пример кода использования Task из http://fxexperience.com/2011/07/worker-threading-in-javafx-2-0/ и используя прослушиватель 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.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()
            }
        }
    });
person Avik    schedule 14.10.2012
comment
Как я узнаю, когда запускать задачу? В настоящее время я создаю программу задач, и мне нужно только обновить графический интерфейс, когда что-то происходит с 1 или несколькими участниками чата, например, с текстом чата или если к чату подключается новый человек. - person Marc Rasmussen; 14.10.2012
comment
и под программой задачи я подразумеваю программу чата (извините, опечатка). - person Marc Rasmussen; 14.10.2012
comment
Хорошо, просто позволь мне понять это прямо! Я создаю новый класс под названием client listner, который расширяет поток. Затем я создаю задачу в своем графическом контроллере и передаю ее в качестве параметра моему потоку? Или кто работает? - person Marc Rasmussen; 14.10.2012
comment
Я использовал Smack API для обмена сообщениями и создания Hyperbola в Eclipse. В вашем контроллере установите соединение, определите анонимный класс для Task, переопределите его метод запуска, добавив такой код PacketListener — if (connection != null) { PacketListener listener = new PacketListener() { public void processPacket(Packet packet) { Message message = (Message) packet; if (message.getType() == Message.Type.chat) startChat(message); } }; PacketFilter filter = new PacketTypeFilter(Message.class); connection.addPacketListener(listener, filter); } и вызовите new Thread(task).start();. - person Avik; 14.10.2012
comment
Я очень рад за ваш ответ :) и спасибо за всю вашу помощь. Могу я попросить вас о помощи по скайпу? чтобы я знал, что я на правильном пути? :) мне бы очень помогло! - person Marc Rasmussen; 15.10.2012
comment
LOL, нашел более 35 учетных записей Марка Расмуссена в Skype. Мой скайп-аккаунт acedude0101. - person Avik; 15.10.2012
comment
Спасибо дружище :) я тебя добавлю :D - person Marc Rasmussen; 15.10.2012
comment
Я добавил тебя, я NemeoDizzy - person Marc Rasmussen; 16.10.2012

Вы ищете соответствующий SwingUtil.invokeLater в JavaFX. Если да, то это Platform.runLater(java.lang.Runnable runnable)

Цитата из API http://docs.oracle.com/javafx/2/api/javafx/application/Platform.html

Запустите указанный Runnable в потоке приложения JavaFX в неопределенное время в будущем.

person amru    schedule 14.10.2012