Как я могу запустить серверный сокет в фоновом режиме с помощью графического интерфейса Java Swing и по-прежнему использовать графический интерфейс?

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

В настоящее время, когда я нажимаю кнопку для запуска сервера, кнопка остается нажатой, а остальная часть графического интерфейса недоступна, пока я не остановлю ее принудительно в Netbeans. Я хочу включить кнопки для остановки сервера и т. Д., Поэтому я хочу знать, как я могу запустить код сервера в фоновом режиме при взаимодействии с графическим интерфейсом для чего-либо еще.

Как я могу добиться этого в графическом интерфейсе?


person Rookie    schedule 23.03.2012    source источник
comment
Измените свой вопрос, указав хотя бы некоторые детали кода. В противном случае мы будем догадываться, что такое базовый сервер.   -  person Gray    schedule 24.03.2012
comment
@Andrew EDT == Тема диспетчеризации событий?   -  person Gray    schedule 24.03.2012
comment
@Hovercraft Я решил обновить этот комментарий до ответа, так как это почти наверняка проблема.   -  person Andrew Thompson    schedule 24.03.2012
comment
@Gray Верно в первый раз. Каждый программист Swing должен быть знаком с ним и с тем, что значит программировать его учет.   -  person Andrew Thompson    schedule 24.03.2012
comment
Конечно @Andrew. Я всегда отвечаю и комментирую для потомков и стараюсь быть многословным. Ваше здоровье.   -  person Gray    schedule 24.03.2012
comment
Спасибо за комментарии, я посмотрю на эту ссылку Hovercraft :-) Кроме того, когда я говорю «базовый сервер», он в основном получает файл, отправленный от клиента, перед закрытием.   -  person Rookie    schedule 24.03.2012
comment
@Gray Я ... стараюсь быть подробным. Когда я пытаюсь быть подробным в комментарии, я обычно превышаю ограничение на количество символов. :(   -  person Andrew Thompson    schedule 24.03.2012


Ответы (2)


Не блокируйте EDT (поток отправки событий). Запустите сервер на Thread. Подробнее см. Параллелизм в Swing.


Упоминается в комментарии, но также см. Этот (очень много) связанный пример предоставления графического интерфейса Swing для сервера и клиента.

введите описание изображения здесь

person Andrew Thompson    schedule 23.03.2012

Для этой цели вам следует использовать класс Thread.
Реализуйте исполняемый интерфейс в своем основном классе, а затем переопределите метод run (). Поместите коды, которые вы хотите, чтобы они выполнялись при нажатии кнопки в методе run (). Затем в кнопке ActionListener напишите этот код:

new Thread(this).start();

Это выполнит код в другом «потоке».

person mehrmoudi    schedule 23.03.2012
comment
Я думаю, что у вашего совета есть некоторые слабые места, так как он снижает сплоченность класса и увеличивает сплоченность. Класс GUI также не должен быть классом Runnable, поскольку код сокета должен находиться в отдельном классе и полностью игнорировать весь код GUI. Также лучше использовать SwingWorker, а не простой поток, поскольку SwingWorker имеет инструменты, которые позволяют взаимодействовать и взаимодействовать с потоком Swing, которого нет у Thread. - person Hovercraft Full Of Eels; 24.03.2012
comment
Я просто хотел дать ему быстрое решение для преодоления его проблемы; в большем масштабе и в более крупном проекте - да, вы правы. Это не лучшее решение! - person mehrmoudi; 24.03.2012
comment
на мой взгляд, я думаю, что это проблема OP, я бы предложил отредактировать реальный ответ о EDT, лучше бы удалить это - person mKorbel; 24.03.2012