2014-04-24 7 views
0

다음 코드를 작성했습니다. 전체 소스가 아니라 psudo 코드가 표시되었습니다.자바 스윙에서 버튼을 클릭 한 후 버튼 텍스트를 바로 아이콘으로 변경할 수 없습니다.

class UI extends JFrame 
{ 
    //created UI with one Button 
    onButtonclick() 
    { 
     //did some operation before set icon to button 
     //say opened fileopen dialog and get file 
     button.setText(""); 
     ImageIcon progressbar = new  
      ImageIcon(DatasetExporterUI.class.getResource("/progreassbar.gif")); 
      buttonExport.setIcon(progressbar); 

     // did some database operations 
     //again removed icon from button 
     button.setIcon(null); 
     button.setText("click"); 
    } 
} 

버튼을 클릭하면 파일 열기 대화 상자가 열리고 버튼 텍스트는 비어 있습니다. 버튼에 아이콘을 설정하지 않았습니다. 버튼에 설정된 아이콘 이후에 수행되는 모든 데이터베이스 작업이 완료되면 버튼에 아이콘이 나타납니다. 왜이 동작입니까? 버튼에 아이콘을 설정하고 데이터베이스 작업을 수행 한 다음 다시 제거하는 방법은 무엇입니까? 감사합니다. :)

+0

변경 사항을 적용하려면'repaint' 메소드를 호출 했습니까? – Salah

+0

예. 작동하지 않습니다. –

+0

버튼 레이블을 변경할 때 구성 요소를 다시 그려주세요. –

답변

3

그래픽 사용자 인터페이스 시스템은 대부분의 코드와 같은 (스레드를 사용하는 코드 제외), 한 번에 하나의 일을 할 수 있습니다. 청취자를 부르는 것이 중요합니다. GUI 시스템은 리스너가 실행되는 동안 다른 작업을 수행 할 수 없습니다.

데이터베이스 작업은 작성 가능한 다른 스레드에서 실행하고 완료되면 GUI를 업데이트해야합니다. 이 같은 것 :

void onButtonPressed() { 
    // The code to open the file dialog goes here 

    button.setText(""); 
    ImageIcon progressbar = new  
     ImageIcon(DatasetExporterUI.class.getResource("/progreassbar.gif")); 
     buttonExport.setIcon(progressbar); 

    new Thread() { 
     @Override 
     public void run() { 
      // do some database operations here 

      EventQueue.invokeLater(new Runnable() { 
       @Override 
       public void run() { 
        //again remove icon from button 
        button.setIcon(null); 
        button.setText("click"); 
       } 
      }); 
     } 
    }.start(); 
} 

다른 스레드의 코드가 동시에 실행됩니다. 이것은 편리하지만 위험합니다. 새 스레드에서 데이터에 액세스 할 때 매우주의하십시오. 한 스레드가 필드를 변경하고 다른 스레드가 스레드를 읽는 경우 결과가 예상과 다를 수 있습니다. 가장 간단한 방법은 주 스레드가 실행되는 동안 새 스레드가 사용하는 변수를 변경하지 않도록하는 것입니다.

데이터베이스 작업이 완료되면 setText를 호출하여 단추를 정상으로 설정할 수 없습니다. 주 스레드 만 GUI에 영향을 줄 수 있습니다. 주 작업 스레드가 화면의 단추를 그리는 동안 데이터베이스 작업 스레드가 텍스트를 변경하는 경우에는 어떻게됩니까? 단추가 잘못 그려 질 수 있습니다. 따라서 바쁜 시간이 아닐 때 가까운 시일 내에 코드를 실행하도록 GUI 시스템에 알려주는 EventQueue.invokeLater으로 전화해야합니다. new Runnable() {} 안에있는 코드는 단추 수신기의 코드와 비슷합니다. 다른 GUI 관련 코드는 실행되지 않습니다.

+0

Nice Answer !!! :) –

0

이 작동합니다 :

Image progressbar= ImageIO.read(DatasetExporterUI.class.getResource("/progreassbar.gif")); 

buttonExport.setIcon(new ImageIcon(progressbar));