2017-02-15 5 views
2

JPanel에 문제가 있습니다. 인터페이스가있는 html/css 스크레이퍼를 만들었습니다. 이 인터페이스에는 스크래퍼가 "Found HTML"및 "Saved Files Succesfully"와 같은 단계로 업데이트하는 JTextArea가 있습니다. 코드가 실행되는 동안이 메시지를 JTextArea에 추가하려고합니다. 간단한 검사는 옵저버 패턴과 함께 업데이트가 작동하지만 모든 코드가 완료 될 때까지 모든 메시지가 표시되지 않음을 보여줍니다.Java Jpanel이 완료된 코드 만 업데이트

private void addItem(String line, char type, String classOrId) { 
    String[] lineSplit = line.split(classOrId+"="+type); 
    lineSplit = lineSplit[1].split(""+type); 
    lineSplit = lineSplit[0].split(" "); 
    for (String a : lineSplit) { 
     if(classOrId == "id"){ 
      if (!usedIds.contains(a)) { 
       usedIds.add(a); 
      } 
     } 
     else if(classOrId == "class"){ 
      if (!usedClasses.contains(a)) { 
       usedClasses.add(a); 
      } 
     } 
     consoleText = consoleText + "Class \"" + a + "\" is found."; 
     setChanged(); 
     notifyObservers(); 
    } 
} 

예제 코드 관찰자 클래스 :

public class ScraperView extends JPanel implements Observer { 
    Scraper scraper; 
    public ScraperView(Scraper scraper){ 
     this.scraper = scraper; 
     scraper.addObserver(this); 
     this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); 
     refresh(); 
    } 

    private void refresh() { 
     System.out.println("TrIGGER"); 
     removeAll(); 
     int removedClasses = scraper.getRemovedClasses(); 
     int totalClasses = scraper.getTotalClasses(); 
     JLabel classesText = new JLabel(" Total Classes:  "+ Integer.toString(totalClasses)); 
     JLabel removedClassesText = new JLabel(" Removed Classes: "+ Integer.toString(removedClasses)); 
     this.add(classesText); 
     this.add(removedClassesText); 
     this.revalidate(); 
     this.repaint(); 
    } 
    @Override 
    public void update(Observable o, Object arg) { 
     refresh(); 
    } 
} 

JPanel에이 업데이트 될 때까지 기다릴 수있는 방법이 있나요

예제 코드 observerable 클래스에서 (100 번 같은 트리거)? 코드가 매번 트리거되지만 알림은 업데이트되지 않습니다.

+0

JavaFX로 전환하는 것이 좋습니다. 스윙은 더 이상 사용하지 말아야합니다. 스윙을 사용해야하는 경우 논리를 다른 스레드로 이동하면 주기적으로 UI가 업데이트됩니다. – MustSeeMelons

+0

당신의 코드는'EDT (Event Dispatch Thread)'에서 실행 중이며 모든 코드가 끝날 때까지 Swing이 다시 칠할 수 없습니다. 코드는 별도의 스레드에서 실행해야합니다. [동시성의 동시성] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html)에 대한 스윙 튜토리얼의 섹션을 읽으십시오. 자세한 내용은 – camickr

답변

1

SwingWorker 클래스는 UI를 업데이트하는 동안 스레드에서 작업을 수행하도록 설계되었습니다.

0

새로 추가 할 JLabel 당신이 업데이트 할 때마다 좋은 아이디어가 아닙니다. 레이블을 한 번 생성 한 다음 업데이트해야합니다. 또한 업데이트해야 할 UI 스레드에서 업데이트해야합니다. 할 수있는 일 SwingUtilities.invokeLater(Runnable)