1

Я пытаюсь установить сетевое соединение, а детали находятся в JFrame. Когда пользователь нажимает кнопку, он должен начать новый поток и должен показать сообщение ожидания пользователю до тех пор, пока основной поток не установит сетевое соединение. Я написал этот кодновый поток, не показывающий кадр

public void actionPerformed(ActionEvent arg0) { 
    Thread ref = new Thread(new Test());//Create a new thread 
    ref.start(); 
     new AIDRTConnManager().createConnection(ipAddress, portAddress);//main thread 
     } 



//This is my Thread Class 
    public class Test implements Runnable{ 
    JDialog waitDialog; 
    JPanel panel1 = new JPanel(); 
    JLabel waitLabel; 
    JFrame frame; 


    public void run(){ 
     frame = new JFrame(); 
     waitDialog = new JDialog(frame,AIRDT.toolName, true); 
     waitDialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); 
     JLabel waitLabel = new JLabel("Trying to Connect to PleaseWait...",ErrorDialog.icon,SwingConstants.CENTER); 
      panel1.add(waitLabel); 
      waitDialog.add(panel1); 
      waitDialog.setSize(100, 40); 
      waitDialog.setBounds(500,300, 300, 80); 
     waitDialog.setVisible(true); 
    } 
} 

Но когда я нажимаю на кнопку, то JDialog показывает пустой кадр, без сообщения ожидания (JLable) и один раз я сделал с сетевым подключением, это ожидание сообщение правильно показывает.

Где я ошибаюсь? Является ли это проблемой качания (или) проблемой нити?

Не могли бы вы помочь мне показать сообщение ожидания до завершения деятельности на заднем конце?

+0

Забавный, что вы называете 'waitDialog.setSize (100, 40); waitDialog.setBounds (500 300, 300, 80); 'setBounds' является ярлыком для вызова setLocation() и setSize() сразу. –

ответ

3

Вы смешиваете свои темы здесь - все операции, которые взаимодействуют с пользовательским интерфейсом, такие как создание нового фрейма, должны возникать в потоке отправки событий (EDT) или в «главном» потоке, как вы его называете. Фоновые задачи должны выполняться в другом потоке.

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

+0

+1 действительно, он все понял. Диалоговое окно ожидания должно быть инициировано в actionPerformed, пока соединение должно быть выполнено в новой теме. Просто, чтобы прояснить все это, то, что обычно называют «Основной поток», представляет собой поток, в котором метод main (String [] args) вызывается при старте JVM. Он часто смешивается с EDT, потому что многие пользователи запускают пользовательский интерфейс в «Главном потоке», в то время как это должно быть сделано с помощью 'SwingUtilities.invokeLater' для этого в EDT. –

+0

@ajshort Спасибо за подробное объяснение. Он частично разрешил мою проблему. Я сделал свою работу в новом потоке и создал сетевое соединение. Между тем я установил waitDialog.setVisible (true); в моей главной теме. Но после установки этого мой основной поток не возобновляется вообще. Что происходит в waitDialog.setVisible (true) ;? Он показывает диалог ожидания. Но после этого ничего не работает. Я добавил условие, чтобы проверить, была ли выполнена моя фоновая работа. Если это так, я пытаюсь скрыть Waitdialog. Но это условие не работает. waitDialog.setVisible (true) заморозить основной поток.Pl Help – Karthik

+0

Вместо того, чтобы добавлять условие, вы должны добавить обратный вызов из потока, который вы создаете, в свой основной поток, чтобы уведомить его, когда работа выполнена. Существует класс SwingWorker, который предназначен именно для того, что вы пытаетесь сделать. Он запустит задачу в фоновом режиме, а затем вызовет метод «done» на EDT, когда он будет завершен. См. Http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html для действительно хорошего обзора. – ajshort

3

Код под номером actionPerformed выполняется в разделе «Диспетчер событий» (EDT), а не в основном потоке, как вы говорите в комментарии.

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

Кроме того, не имеет отношения к проблеме, но учтите, что вы создаете JFrame, который никогда не отображается, и который является родителем вашего JDialog.

 Смежные вопросы

  • Нет связанных вопросов^_^