2013-03-09 3 views
1

일부 실행 로그를 표시 할 텍스트 영역 스윙 요소가 있습니다. 메시지는 각 실행 단계 후에 나타나야합니다. 예 : '가져 오기가 시작되었습니다.' 그러나 문제는, 모든 로그 메시지는 한 번만 버튼 동작 수행 이벤트가 completed.Below 후 나는 텍스트단추 작업 수행 이벤트로 텍스트 영역이 업데이트되지 않음

당신이 GUI 스레드에서 모든 ActionPerformed 물건을 할 때문이다
getXmlButton = new JButton("Fetch Reports"); 
    getXmlButton.addActionListener((new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 

      createDirectory(); 
      stutusArea.append("Fetching has been started"); 
      final String password = passwordTextField.getText(); 
      final String username = loginTextField.getText(); 

      OperatingSystemDriver os = new OperatingSystemDriver(); 
      driver = os.getDriver(); 

      stutusArea.append("getting some url"); 
      driver.get(URL); 



      try { 
       LoginPage login = new LoginPage(driver); 
       login.loginAs(username, password); 
       stutusArea.append("successful login"); 
      } catch (Exception e1) { 
       stutusArea.append("login error"); 
      } 
    insertToDbButton.setEnabled(true); 
     } 
    })); 
+1

EDT (Event Dispatch Thread)를 차단하지 마십시오. GUI는 'Freeze'할 것입니다. 대신 오랫동안 실행되는 작업을 위해'SwingWorker'를 구현하십시오. 자세한 내용은 [동시성의 동시성] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)을 참조하십시오. –

답변

1

을 표시하는 데 사용되는 방법입니다 나타날 것입니다 그렇지 않으면 GUI 블록 Thread Example

+0

두 번째 링크 된 기사에서는 GUI가 아닌 환경에서이 작업을 수행하는 방법을 보여 주지만 GUI 용으로 수행하는 방법에 대해서는 특별한 고려 사항이 필요합니다. E.G. 모든 GUI 업데이트는 EDT에 있어야하며 오래 실행되는 작업은 제거해야합니다. 자세한 내용은 위의 내 의견을 참조하십시오. –

+0

예, 두 번째 링크 된 기사는 일반적인 예입니다. 귀하의 의견을 읽었으며 사실 SwingWorker에 대해 알지 못했습니다. JavaDoc을 읽은 후에는 확실히 더 좋은 방법이라고 생각합니다. 감사합니다! – BackSlash

2

당신은 다른 스레드를 사용해야합니다 : 그래서 당신의 ActionPerformed 물건에 대한 GUI가 정지 및 대기, Threads을 사용하고이를 방지 할 수있는 방법을 수행하기 위해, 예를 들어 있습니다.

GUI를 다른 스레드에서 업데이트하는 것은 좋지 않은 생각이므로 일부 이상한 오류/버그를 피하려면 SwingUtilities.invokeLater을 사용하십시오.

public void actionPerformed(ActionEvent e) { 
    new Thread(new Runnable() { 
     public void run() { 
      SwingUtilities.invokeLater(new Runnable() { 
       public void run() { 
        stutusArea.append("Fetching has been started"); 
       } 
      }) 
      final String password = passwordTextField.getText(); 
      final String username = loginTextField.getText(); 
      // ... 
     } 
    }).start(); 
} 
+0

관련 [예제] (http://stackoverflow.com/a/3245805/230513)도 참조하십시오. – trashgod