2014-04-16 3 views
3

JavaFX TableView 선택을 지울 때 문제가 발생합니다. myTableView.getSelectionModel()을 실행할 때 clearSelection()이 다음 오류를 표시합니다.Javafx 테이블 뷰 선택을 취소하면 NullPointerException이 발생합니다.

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException 
at javafx.scene.control.TableView$TableViewArrayListSelectionModel.handleSelectedCellsListChangeEvent(TableView.java:2657) 
at javafx.scene.control.TableView$TableViewArrayListSelectionModel.clearAndSelect(TableView.java:2180) 
at javafx.scene.control.TableView$TableViewSelectionModel.clearAndSelect(TableView.java:1733) 
at com.sun.javafx.scene.control.behavior.TableCellBehaviorBase.simpleSelect(TableCellBehaviorBase.java:318) 
at com.sun.javafx.scene.control.behavior.TableCellBehaviorBase.doSelect(TableCellBehaviorBase.java:231) 
at com.sun.javafx.scene.control.behavior.TableCellBehaviorBase.mousePressed(TableCellBehaviorBase.java:144) 
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:95) 
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89) 
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218) 
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) 
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) 
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54) 
at javafx.event.Event.fireEvent(Event.java:204) 
at javafx.scene.Scene$MouseHandler.process(Scene.java:3746) 
at javafx.scene.Scene$MouseHandler.access$1800(Scene.java:3471) 
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1695) 
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2486) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:314) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:243) 
at java.security.AccessController.doPrivileged(Native Method) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:345) 
at com.sun.glass.ui.View.handleMouseEvent(View.java:526) 
at com.sun.glass.ui.View.notifyMouse(View.java:898) 
at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method) 
at com.sun.glass.ui.gtk.GtkApplication.access$200(GtkApplication.java:48) 
at com.sun.glass.ui.gtk.GtkApplication$6$1.run(GtkApplication.java:149) 
at java.lang.Thread.run(Thread.java:744) 

이러한 종류의 오류가 있습니까? TableView 및 내 콘텐츠에 대한 바인딩을 만들었습니다. TableView에서 원하는대로 콘텐츠를 보여줍니다. 표보기에서 내용을 선택하고 내용을 처리 한 다음 표보기에서 내용을 제거하려고합니다. 다음과 같이

내 테이블 선택 모델 리스너는 다음과 같습니다

orderTable.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() { 

     @Override 
     public void changed(ObservableValue observable, Object oldValue, Object newValue) { 
      setIndex(orderTable.getSelectionModel().getSelectedIndex()); 
     } 
    }); 

지수는 IntegerProperty이다. 정수 속성에 인덱스를 유지하고 변경 사항을 수신 대기합니다.

index.addListener(new ChangeListener() { 

     @Override 
     public void changed(ObservableValue observable, Object oldValue, Object newValue) { 
      Integer newVal = (Integer) newValue; 
      System.out.println(String.format("Selected index changed: %s", newVal)); 

      orderTable.getSelectionModel().clearSelection();  
     } 
    }); 

여기서 삭제 섹션은 위의 오류를 나타냅니다. 이것에 대한 도움이 필요하십니까? 감사합니다.

답변

1

clearSelection이 청취자에서 변경된 메소드를 다시 호출하고 newValue가 null이되기 때문입니다. if (newValue! = null) 문을 거기에 넣으려고 할 수 있습니다.

3

나는 똑같은 오류가있었습니다. 선택한 인덱스에 대해 ChangeListener 안에있는 동안 선택한 인덱스를 수정한다는 것이 원인이라고 생각합니다. 스택 추적을 보면 이벤트 버블 링 루프를 치는 것처럼 보입니다. 따라서 기본적으로 ChangeListener을 종료하고 선택한 인덱스를 수정하기 전에 선택한 인덱스를 처리하기위한 다른 이벤트가 변경되도록해야합니다. Zoltan의 첫 번째 답변에 응답하기 위해 나는이 아이디어를 가지고 있었지만 간단한 디버깅을 통해 사용자 정의 ChangeListener이 여러 번 호출되지 않음을 알 수 있습니다.

필자의 경우 내 대화 상자를 내 ChangeListener에 불러오고 대화 상자를 닫을 때 색인을 지우려고했습니다. 나를 위해 Platform.runLater() 메서드에서 dialog.show() 메서드를 래핑하면 모든 이벤트를 먼저 처리 할 수 ​​있습니다.

clearSelection()으로 전화를 걸 때 Platform.runLater() 방법으로 시도 할 수 있습니다. 예 :

Platform.runLater(()-> { orderTable.getSelectionModel().clearSelection(); }); 

작동 여부는 확실하지만 촬영 가치가 있습니다.

  • chooks
관련 문제