Swing / SwingWorker Вопрос новичка - PullRequest
3 голосов
/ 29 августа 2010

Я пытаюсь реализовать графический интерфейс в Java, но я новичок в качелях. Я хочу кое-что прояснить. Я прочитал, что для того, чтобы поддерживать отзывчивость GUI, я должен использовать класс SwingWorker, чтобы выполнить задачу в отдельном потоке. Хорошо, пока. Нет, у меня есть модель с 15 методами, которые являются удаленными. Каждый метод возвращает другой тип объекта в результате, чем другие. На мой взгляд, пользователь нажимает кнопку и вызывается соответствующий метод в модели. Без использования свингера GUI замерз. Мой вопрос заключается в том, должен ли я создать 15 подклассов потоков Swingworker и создать новый экземпляр каждого из них в соответствии с действиями пользователя? Правильно ли мое понимание? Существует ли стандартный способ для этого или, как я говорю, правильный подход?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 29 августа 2010

Посмотрите на это: Простые фоновые задачи .

Кажется, у тебя две проблемы. Во-первых, что касается количества кода, необходимого при использовании SwingWorker: вам нужно создать подкласс SwingWorker для каждого действия, но это не значит, что они должны быть верхнего уровня, именованными классами или своими собственными. файлы. Они могут быть анонимными классами, как показано в статье, так что код находится в коде обработки событий вашего графического интерфейса.

Во-вторых, в отношении создания экземпляров SwingWorker объектов: вы не можете повторно использовать SwingWorker, но поскольку задания выполняются в результате действий пользователя (например, нажатия кнопки), вы не должны столкнуться с какой-либо производительностью проблемы с созданием новых объектов каждый раз.

0 голосов
/ 01 сентября 2010

Безусловно, SwingWorkers выполняют свою работу.По моему опыту, мне не нравилось использовать SwingWorkers только для одной маленькой работы.Я предпочитаю порождать поток, и этот поток просит поток EventDispatch обновить GUI.Только пользовательский поток EventDispatch должен обновлять пользовательский интерфейс, хотя есть несколько исключений.

Я бы предложил прочитать о потоках в потоках в Swing.

Хотя многопоточность может стать тяжелойи, возможно, это решение не будет работать для вас во всех случаях, если отдельный поток должен вызвать изменение в графическом интерфейсе, используйте что-то вроде

java.awt.EventQueue.invokeLater(new Runnable() 
{ 

    public void run() 
    { 
        // this codes runs on the event dispatch thread 
        // update the ui here.
    } 
}); 
...