Вам необходимо соблюдать правила потоковой передачи Swing, которые вкратце кратко означают, что все выполняемые задачи, такие как ожидание и захват ваших данных, должны выполняться в фоновом потоке, и все вызовы Swing должны выполняться в потоке событий Swing , Используйте SwingWorker
, чтобы помочь вам это сделать.
Пожалуйста, просмотрите Параллельность в Swing , чтобы увидеть учебник со всеми подробностями gory.
, например,
private class MySwingWorker extends SwingWorker {
private byte[] buffer = new byte[2000];
@Override
protected Void doInBackground() throws Exception {
while (true) {
DatagramPacket incoming = new DatagramPacket(buffer, buffer.length);
serverSocket.receive(incoming);
String incomingMessage = new String(incoming.getData());
publish(incomingMessage);
}
return null;
}
@Override
protected void process(List chunks) {
for (String chunk : chunks) {
textArea.append("Client: " + chunk + "\n");
}
}
}
Другие предложения:
execute()
в SwingWorker для его запуска. get()
на свой SwingWorker, даже если он возвращает Void. Это поможет мне отследить и ответить на любые исключения, которые могли произойти в SwingWorker по мере его запуска.