2012-01-02 5 views
0
btnnew.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      try { 
       System.out.println("Hello"); 
       packetListener.listener(); 
      } catch (Exception e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
     } 
    }); 

실행하면 검은 색 화면이 나타납니다. 그러나 packetListener.listener();이 생성자에서 호출 할 때 표시됩니다.프레임에 검은 색 화면이 표시됩니다.

왜 이런 일이 발생했는지 설명해 주실 수 있습니까?

+0

이유는 모든 다운 투표를하는 데 도움이

try { System.out.println("Hello"); new Thread(new Runnable() { public void run() { packetListener.listener(); } }).start(); } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } 

희망처럼 사용할 수 있습니까? – Basic

답변

1

나는 packetListener.listener(); 메서드가 UI를 차단하는 복잡한 작업을 수행한다고 생각합니다.

패킷 수신을위한 스레드를 만드는 것이 좋습니다. 즉,이 당신에게

+0

@ user1089146, 일주일 전에이 답변을 주셨습니다. 이 튜토리얼에서는 별도의 Thread를 사용해야하는 이유를 설명하는 정확한 문제점을 설명합니다. 코드를 쉽게 작성하도록 스레드를 생성하는 SwingWorker를 사용하여 작업 솔루션을 제공합니다. – camickr

3

리스너에서 실행되는 코드는 EDT에서 실행됩니다. packetListner.listener() 메서드가 차단되어 GUI가 중단되는 경우가 있습니다. EDT를 차단해서는 안됩니다.

Concurrency에 대한 스윙 튜토리얼 섹션에서이 문제와 해결책에 대한 전체 설명을 읽어보십시오.

관련 문제