2010-06-25 3 views
0

항목이 선택 될 때마다 ActionListener를 사용하여 JList를 업데이트하고 있습니다.예외가 JList의 업데이트를 죽이는 것 같습니다

jComboBox.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     JComboBox cb = (JComboBox) e.getSource(); 
     updateLocalFileList(cb.getSelectedItem().toString()); 
    } 
}); 

UI 용으로이 메서드를 호출하고 있습니다.

getFileListFromDirectory는()는 NullPointerException를 제공하는 경우
public void updateLocalFileList(String path){ 
    DefaultListModel model = new DefaultListModel(); 
    for (String str : LocalFileSystem.getFileListFromDirectory(path)) { 
     model.addElement(str); 
    } 
    getJList().setModel(model); 
} 

는 빈 DVD 드라이브의 문자를 선택하면 말은 의도 한대로 작업에서 ActionListener를 방지하기 위해 보인다.

정확히 무슨 일이 일어나는 지 모르겠지만 모델에 null 값을 전달하면이 문제가 발생한다고 생각됩니다.

아이디어가 있으십니까? 요청에 따라

편집 여기

는 스택 트레이스입니다. 보시다시피이 메서드는 탐색 할 수없는 드라이브에서 NullPointerException을 유발합니다. 나는 JList를 업데이트하지 못하게하는 이유는 정확히 알지 못한다.

java.lang.NullPointerException 
    at mine.View.updateLocalFileList(View.java:274) 
    at mine.View$1.actionPerformed(View.java:262) 
    at javax.swing.JComboBox.fireActionEvent(Unknown Source) 
    at javax.swing.JComboBox.setSelectedItem(Unknown Source) 
    at javax.swing.JComboBox.setSelectedIndex(Unknown Source) 
    at javax.swing.plaf.basic.BasicComboPopup$Handler.mouseReleased(Unknown Source) 
    at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source) 
    at java.awt.Component.processMouseEvent(Unknown Source) 
    at javax.swing.JComponent.processMouseEvent(Unknown Source) 
    at javax.swing.plaf.basic.BasicComboPopup$1.processMouseEvent(Unknown Source) 
    at java.awt.Component.processEvent(Unknown Source) 
    at java.awt.Container.processEvent(Unknown Source) 
    at java.awt.Component.dispatchEventImpl(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Window.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 
+0

stacktrace 붙여 넣기 – OscarRyz

+1

이것이 정확히 어떤 일인지는 모르겠지만이 답변을 통해 스택 추적 (stacktrace)을 읽는 방법을 알아 봅니다. (그리고 그것이 무엇일까요?) http://stackoverflow.com/questions/3066253/java-boxes-mask-not-working/3066299 # 3066299 – OscarRyz

+0

@Support 링크를 포함 시켰습니까? –

답변

2

더 강력하게 만들려면 두 가지를해야합니다.

  1. getFileListFromDirectory가 null을 반환하지 않도록하십시오. 항목이없는 경우 null이 아닌 Collections.emptyList을 반환하십시오. 이것이 가능하지 않으면 "for each"반복을 사용하기 전에 반환 값을 특별히 확인하십시오. null 포인터가 있으면 모델이 업데이트되지 않습니다. 따라서 빈 드라이브를 클릭해도 파일 목록이 지워지지는 않습니다.
  2. 로컬 변수에 cb.getSelectedItem()을 할당하고 updateLocalFileList를 호출하기 전에 null을 확인하십시오. cb.getSelectedItem()이 null 인 경우 파일 목록을 지우도록 선택할 수 있습니다.
+0

제안 해 주셔서 감사합니다. 'Collections.emptyList'를 메서드에 추가하는 것은 그것이 null 참조가 아닌 List를 돌려 주어야하기 때문에 의미가 있습니다. 또한 그래픽 측면에 몇 가지 검사를 추가 할 것입니다. –

+0

getSelectedItem()이 null을 반환하도록하려면 항목을 선택한 다음 Ctrl 키를 누른 채로 항목을 다시 선택합니다. –

1

NullPointerException이는 EventDispatchThread로 발생 (모든 GUI 업데이트 코드는 일반적으로 발생하는 위치이다) 그래서 이벤트 리스너 자체를 중단합니다. 따라서 GUI가 제대로 업데이트되지 않습니다 (더 이상). 명시 적으로 예외를 처리하거나 그렇지 않으면 트리거 할 수있는 원인을 차단해야하는 것을 방지하십시오.

+0

'Thread.UncaughtExceptionHandler'를 확장 한 클래스가 있고'Thread.setDefaultUncaughtExceptionHandler()'를 사용하여 항목을 설정하고 있습니다. 나는 그것이 충분한 지 모른다. 현재는 텍스트로 예외가 출력됩니다. –

+0

시각화하려고 시도 : getFileListFromDirectory()에서 발생하는 예외는 이벤트 리스너를 인터럽트합니다. 제어 흐름이 예외 처리기로 전송되므로 setModel() 호출에 도달하지 못하므로 GUI가 제대로 업데이트되지 않습니다. – user268396

+0

설명 주셔서 감사합니다. Swing 애플리케이션에서 예외를 처리하는 좋은 예가있는 사이트를 알고 계십니까? –

1

청취자 (예외를 발생시키는 수신기)만이 특정 이벤트를 수신하는 것이 아닙니다. 코어 스윙 클래스 (특히 UI 델리게이트)는 UI를 올바르게 업데이트 할 수 있도록 자체 리스너를 등록합니다. 청취자가 실패하면, 모든 특정 청취자에게이 특정 이벤트가 통지 될 것이라고 보장 할 수 없습니다.

0

점 몇 :

정확히 LocalFileSystem 클래스가 무엇입니까? 그게 커스텀 클래스인가요?

경우에 따라 null을 반환 할 것으로 예상되는 경우 로컬 변수를 사용하고 메서드를 호출하기 전에 null인지 확인하십시오.

Fileexists 방법을 사용하여 주어진 파일이나 디렉토리가 있는지 확인할 수 있습니다. isDirectory 방법도 있습니다. 나는 그것을 사용하는 것이 좋습니다.

+0

'LocalFileSystem'은 정말로 커스텀 클래스입니다. 이 메소드는 File의'list' 메소드를 사용하여 파일리스트를 돌려 보낸다 (이것은 디렉토리를 탐색하기위한 것이다). 비어있는 cd/dvd 또는 disquette 드라이브에 대해 null을 반환합니다. –

+0

그러면 내 조언은 간단히 다음과 같습니다. 변수에 null *이있을 수있는 경우, 메서드를 호출하기 전에 프로그래밍 방식으로 검사를 수행하십시오. – Avrom

관련 문제