2011-04-15 4 views
0

내부에 for 루프 이벤트가있는 jbutton을 누르면 다른 구성 요소가 비활성화됩니다. 루프가 완료되면 왜 다른 버튼이나 스윙 구성 요소가 루프를 사용하지 못하게합니까?

try{ 
     InetAddress localhost = InetAddress.getLocalHost(); 
     byte[] ip = localhost.getAddress(); 

     for(int i=1;i<254;i++){ 
      ip[3]=(byte)i; 
      final InetAddress address = InetAddress.getByAddress(ip); 

      if(address.isReachable(1000)){ 
       listModel1.addElement(address); 
       System.out.println(address + "-Machine is turned on and can be ping."); 
       Rectangle progressRec = jProgressBar1.getBounds(); 
       progressRec.x = 0; 
       progressRec.y = 0; 
       jProgressBar1.setValue(i); 
       jProgressBar1.paintImmediately(progressRec); 
      } 
     } 
     jList1.setModel(listModel1); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 

그런 다음, 다른 구성 요소가 사용되었다 : 여기

는 내가하는 JButton에서이 코드입니다? 어떻게 처리할까요? 미리 감사드립니다 ...

편집 코드 : 당신은 그들이 응답하지 의미하는 '장애인'으로, 아마도

try{ 
     InetAddress localhost = InetAddress.getLocalHost(); 
     final byte[] ip = localhost.getAddress(); 

     SwingWorker<ListModel, InetAddress> worker = new SwingWorker<ListModel, InetAddress>(){ 
      public ListModel doInBackground() throws UnknownHostException, IOException{ 
       for(int i=1;i<254;i++){ 
        ip[3]=(byte)i; 
        final InetAddress address = InetAddress.getByAddress(ip); 

        if(address.isReachable(1000)){ 
         publish(address); 
         listModel1.addElement(address); 
         Rectangle progressRec = jProgressBar1.getBounds(); 
         progressRec.x = 0; 
         progressRec.y = 0; 
         jProgressBar1.setValue(i); 
         jProgressBar1.paintImmediately(progressRec); 
        } 
       } 
       return listModel1; 
      } 

      @Override 
      public void process(List<InetAddress> addresses){//there was a problem here. 
       for(InetAddress address : addresses){ 
        System.out.println(address + "-Machine is turned on and can be ping."); 
       } 
      } 

      @Override 
      public void done(){ 
       try { 
        jList1.setModel(get()); 
       } catch (InterruptedException ex) { 
        Logger.getLogger(NetCafeTime.class.getName()).log(Level.SEVERE, null, ex); 
       } catch (ExecutionException ex) { 
        Logger.getLogger(NetCafeTime.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 
     }; 
     worker.execute(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 

답변

5

코딩에 더 좋은 제안.

구성 요소를 다시 칠하는 것과 같은 GUI 관련 작업을 모두 처리하는 매우 비싸고 수명이 긴 작업을 수행하고 있기 때문에 이러한 현상이 발생합니다. 코드가이 스레드를 차단하면 스윙은 일반적인 작업을 빠르게 수행 할 수 없으며 UI는 사용자 작업에 응답하지 않게되고 페인팅 또는 그리기 작업은 지연/정지로 나타날 수 있습니다.

과도한 작업을 수행하고 결과를보고하려면 새 스레드를 생성해야합니다. 스윙은 원하는 것을 할 수 있도록 도와주는 SwingWorker 클래스를 제공합니다.

더러운 빠른 및 코드 :

try{ 
    InetAddress localhost = InetAddress.getLocalHost(); 
    final byte[] ip = localhost.getAddress(); 

    SwingWorker<ListModel, InetAddress> worker = new SwingWorker<ListModel, InetAddress>() 
    { 
     public ListModel doInBackground() 
     { 
      for(int i=1;i<254;i++){ 
       ip[3]=(byte)i; 
       final InetAddress address = InetAddress.getByAddress(ip); 

       if(address.isReachable(1000)){ 
        publish(address); 
        listModel1.addElement(address); 
       } 
      } 

      return listModel1; 
     } 

     public void process(List<InetAddress> addresses) 
     { 
      for(InetAddress address : addresses) 
      { 
       System.out.println(address + "-Machine is turned on and can be ping."); 
       Rectangle progressRec = jProgressBar1.getBounds(); 
       progressRec.x = 0; 
       progressRec.y = 0; 
       jProgressBar1.setValue(i); 
       jProgressBar1.paintImmediately(progressRec); 
      } 
     } 

     public void done() 
     { 
      jList1.setModel(get()); 
     } 
    }; 

    worker.execute(); 

}catch(Exception e){ 
    e.printStackTrace(); 
} 

연구 교재 :

+0

와우, 코딩을 잘 못해서 고마워요. –

+0

당신은 환영합니다 :) 내가 제안한 코드를 테스트/실행하지 않았다는 것에 유의하십시오. 문제가 있다면, 다시 게시하십시오! –

+0

"public void process (List addresses)"스레드에서 문제가 발생했습니다. List 에의 참조가 모호합니다. java.util의 java.util.List 인터페이스와 java.awt의 클래스 java.awt.List가 일치하고 있습니다. 그 의미는 무엇인가? 다시 한 번 감사드립니다 ... –

2

당신이 할 수있는 핸들러가 실행 중일 때는 다른 모든 컴포넌트에 액세스 할 수없고 화면을 다시 칠할 수 없기 때문에 이벤트 핸들러 내부에서 실질적인 컴퓨팅을 수행하지 않습니다. 새 스레드를 만들고 그 스레드에서 처리해야합니다.

2

스레드에 루프를 추가하고 단추를 한 번 클릭하면 스레드가 시작됩니다. 현재 버튼 이벤트 메서드가 완료 될 때까지 루프가 차단되었습니다.

+0

감사합니다. 이제 어떻게해야할지 압니다 ... –

관련 문제