Вызов MainClient.active () блокирует ожидание ответа сокета. Поскольку он вызывается в ActionListener, он блокирует поток диспетчеризации событий Swing, в котором запускаются все события пользовательского интерфейса. Это приводит к тому, что пользовательский интерфейс не отвечает.
Если вы можете, используйте SwingWorker для выполнения задачи блокировки в фоновом потоке. Смотри документацию здесь:
http://java.sun.com/javase/6/docs/api/javax/swing/SwingWorker.html
Если SwingWorker недоступен, вы можете сделать это примерно так:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
new Thread(new Runnable() {
@Override
public void run() {
// This gets run in a background thread
String text = jTextArea1.getText();
jTextArea2.append(client.getCurrentName() + " : " + text + "\n");
MainClient.setText(client.getCurrentName() + " : " + text + "\n");
MainClient.active();
}
}).start();
}
Это ужасный способ сделать это, но он также самый короткий и будет работать на любой версии Java, имеющей Swing.
Редактировать: метод clear должен вызываться в потоке диспетчеризации событий, когда он обращается к компоненту пользовательского интерфейса - jTextArea1.setText (""). Чтобы запустить его на EDT, сделайте следующее:
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
clear();
}
});
Анонимные внутренние классы ужасны, особенно когда они находятся внутри других анонимных внутренних классов, но они удобны для примеров кода. В вашей реальной реализации вы должны создать класс, который реализует Runnable для выполнения исходной фоновой задачи, чтобы сделать код более читабельным.
Замыкания в Java 7 должны сделать эту задачу намного менее загроможденной.