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

여기서 스레드를 혼합하고 있습니다. UI와 상호 작용하는 모든 작업 (예 : 새 프레임 만들기)은 EDT (Event Dispatch Thread) 또는 "메인"스레드에서 수행해야합니다. 백그라운드 작업은 다른 스레드에서 수행되어야합니다.

기본적으로 역순으로 진행됩니다. 새 스레드에서 배경 작업을 수행하고 주 스레드에서 새 프레임을 만들어야합니다. 이는 현재 가지고있는 것과 반대입니다.

+0

+1 실제로 그는 모든 것을 뒤집었다. 대기 대화 상자는 새 스레드에서 연결이 수행되어야하는 동안 actionPerformed에서 시작되어야합니다. 이 모든 것을 명확히하기 위해 일반적으로 "주 스레드"라고하는 것은 main (String [] args) 메소드가 JVM의 시작에서 호출되는 스레드입니다. 많은 사용자가 "Main Thread"내에서 UI를 시작하기 때문에 EDT와 종종 섞여있다. EDT에서 이것을 수행하기 위해서는 실제로 SwingUtilities.invokeLater를 사용해야한다. –

+0

@ajshort 자세한 설명을 해주셔서 감사합니다. 내 문제를 부분적으로 해결했습니다. 나는 새 스레드에서 내 배경 작업을했는데 네트워크 연결도 만들었습니다. 한편 나는 waitDialog.setVisible (true)를 설정했다. 내 주요 스레드. 하지만 이걸 설정 한 후에는 내 메인 스레드가 전혀 재개되지 않습니다. waitDialog.setVisible (true);에 무슨 문제가 있습니까? 대기 대화 상자를 보여줍니다. 그러나 그 후 아무것도 작동하지 않습니다. 배경 작업이 완료되었는지 확인하기위한 조건을 추가했습니다. 그렇다면 Waitdialog를 숨기려고합니다. 그러나이 조건 자체는 실행되지 않습니다. waitDialog.setVisible (true) 주 스레드를 고정시킵니다. 도움말 (FAQ) – Karthik

+0

조건을 추가하는 대신 작업을 완료하면 주 스레드에 다시 작성한 스레드의 콜백을 추가하여 알림을 보내야합니다. "SwingWorker"클래스가 있습니다.이 클래스는 수행하려는 작업을 정확하게 처리하도록 설계되었습니다. 백그라운드에서 태스크를 실행 한 다음 완료되면 EDT에서'done' 메소드를 호출합니다. 정말 좋은 개요는 http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html을 참조하십시오. – ajshort

3

actionPerformed 아래의 코드는 주 스레드가 아니라 주석 처리에서 EDT (Event Dispatch Thread) 아래에서 실행됩니다.

연결이 이루어지는 한 EDT는 차단되므로 JDialog과 같은 다른 UI 요소를 처리 할 필요가 없습니다.

또한 문제와 관련이 없지만 표시된 적이없고 JDialog의 부모임을 나타내는 JFrame을 작성한다는 점에 유의하십시오.