2010-12-28 2 views
2

파일 내용을 JList 구성 요소로로드하고 있습니다. 주 스레드에서로드를 수행하면 모든 내용이 정상적으로 처리됩니다. 내용이로드됩니다. 그러나 스레드를 분리하여 코드를로드하고 목록에서 항목을 선택하고 목록을 다시로드하려고하면 임의의 NullPointer 또는 IndexOutOfBounds 예외가 발생합니다. 스윙 스레드 문제 일 수도 있지만 무엇을 결정할 수는 없습니다.JList setListData 스레딩 문제

@Override 
public void onTextLoaded(List<String> textLines) { 
    view.fileLoaded(model.getCurrentFile()); 
    view.setTextLines(textLines); 
    view.enableListComponent(); 
} 

그리고보기 업데이트 : I가 스레드를 떠나 시도했습니다

public void setTextLines(List<String> textLines) { 
    jList.setListData(textLines.toArray()); 
} 

@Override 
public void run() { 
    List<String> textLines = null; 
    textLines = splitter.split(model.getLedMaxChars(), textLoader.loadText(file)); 
    listener.onTextLoaded(textLines);//listener is in main Swing code 
} 

컨트롤러가 듣기에 대한 책임 :

내 스레드 코드 while(true); 루프를 추가하여 응답하지 않으면 모든 것이 정상적으로 작동합니다. 목록에서 항목을 선택하지 않고 새로 고침을하면 모든 항목이 작동합니다.

아무도 내가 여기에없는 것을 설명 할 수 있습니까?

+2

Swing 구성 요소와 관련된 거의 모든 단일 작업이 EDT에서 수행되어야한다는 사실을 알지 못합니까? – SyntaxT3rr0r

답변

2

스윙 당신이 그렇게 할 때, 스레드로부터 안전하지 않습니다에만 스윙 작업자 스레드가 수정을해야한다는 것을 의미 다른 스레드에서 GUI 요소를 조작하면 많은 이상한 일이 발생할 수 있습니다. 귀하의 경우에는 가장 간단한 해결책 (그러나 아마도 최선은 아님)을 사용하는 것입니다 SwingUtilities.invokeLater