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 번 같은 트리거)? 코드가 매번 트리거되지만 알림은 업데이트되지 않습니다.
JavaFX로 전환하는 것이 좋습니다. 스윙은 더 이상 사용하지 말아야합니다. 스윙을 사용해야하는 경우 논리를 다른 스레드로 이동하면 주기적으로 UI가 업데이트됩니다. – MustSeeMelons
당신의 코드는'EDT (Event Dispatch Thread)'에서 실행 중이며 모든 코드가 끝날 때까지 Swing이 다시 칠할 수 없습니다. 코드는 별도의 스레드에서 실행해야합니다. [동시성의 동시성] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html)에 대한 스윙 튜토리얼의 섹션을 읽으십시오. 자세한 내용은 – camickr