2017-05-12 38 views
0

こんにちは、私は自分のコードに問題があります。 Tableviewを作成してリスナーを追加しました。リストのアイテムをクリックすると、リストから他のすべてのアイテムが自動的に削除されます。私のコードはまさにそれを行いますが、私はそれを実行したときには、ここで私にエラーJavafx tableView clear()

を与えるコードです:

public class PgCreatorOverviewController { 

    @FXML 
    private TableView<PgAttributes> tableProps; 
    @FXML 
    private TableColumn<PgAttributes, String> colonna; 

    private MainStage mainStage; 

    private ObservableList<PgAttributes> data = 
      FXCollections.observableArrayList(); 


    public PgCreatorOverviewController() { 
     data.add(new PgAttributes("Razza")); 
    } 

    @FXML 
    private void initialize() { 

     colonna.setCellValueFactory(
       cellData -> cellData.getValue().typeProperty() 
     ); 

     tableProps.setEditable(true); 

     tableProps.getSelectionModel().selectedItemProperty().addListener(
       (observable, oldValue, newValue) -> listener(newValue) 
     ); 


    } 

    public void setMainStage(MainStage mainStage) { 
     this.mainStage = mainStage; 


     tableProps.setItems(data); 
    } 


    public void listener(PgAttributes name) { 
     if (name.getType().equals("Razza")) { 
      PgRazzaController razza = mainStage.showPgRazza(); 
      data.clear(); 
      data.add(new PgAttributes("Classe")); 

     } 

     if (name.getType().equals("Classe")) { 
      data.add(new PgAttributes("Caratteristiche")); 
     } 


    } 


    public class PgAttributes { 

     private final StringProperty type; 

     public PgAttributes(String name) { 
      this.type = new SimpleStringProperty(name); 
     } 

     public String getType() { 
      return type.get(); 
     } 

     public StringProperty typeProperty() { 
      return type; 
     } 

     public void setType(String type) { 
      this.type.set(type); 
     } 

     public boolean equals(PgAttributes uno) { 
      if (uno.getType().equals(this.getType())) 
       return true; 

      return false; 

     } 


    } 

} 

それは動作しますが、コンソールは私にエラーを与えます。ここでスタックトレースは次のとおりです。

Exception in thread "JavaFX Application Thread" java.lang.IndexOutOfBoundsException 
at com.sun.javafx.scene.control.ReadOnlyUnbackedObservableList.subList(ReadOnlyUnbackedObservableList.java:136) 
at javafx.collections.ListChangeListener$Change.getAddedSubList(ListChangeListener.java:242) 
at javafx.scene.control.TableView$TableViewArrayListSelectionModel.handleSelectedCellsListChangeEvent(TableView.java:3004) 
at javafx.scene.control.TableView$TableViewArrayListSelectionModel.clearAndSelect(TableView.java:2423) 
at javafx.scene.control.TableView$TableViewSelectionModel.clearAndSelect(TableView.java:1914) 
at com.sun.javafx.scene.control.behavior.TableCellBehaviorBase.simpleSelect(TableCellBehaviorBase.java:215) 
at com.sun.javafx.scene.control.behavior.TableCellBehaviorBase.doSelect(TableCellBehaviorBase.java:148) 
at com.sun.javafx.scene.control.behavior.CellBehaviorBase.mousePressed(CellBehaviorBase.java:150) 
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.EventUtil.fireEventImpl(EventUtil.java:74) 
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54) 
at javafx.event.Event.fireEvent(Event.java:198) 
at javafx.scene.Scene$MouseHandler.process(Scene.java:3757) 
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485) 
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762) 
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:381) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295) 
at java.security.AccessController.doPrivileged(Native Method) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:417) 
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:416) 
at com.sun.glass.ui.View.handleMouseEvent(View.java:555) 
at com.sun.glass.ui.View.notifyMouse(View.java:937) 
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191) 
at java.lang.Thread.run(Thread.java:748) 

答えて

0

このエラーはSelectionModelChangeListener内の項目をクリアすることによって引き起こされている可能性があります。 SelectionModelは、変更される古いインデックスを使用して選択を変更しようとします(ChangeListener)。

を変更するには、の選択が完了した後、Platform.runLaterを使用してタスクをキューに入れます。このリスナーは、data.clear()の後に再度呼び出され、その時点のnameの値がnullであることに注意してください。

public void listener(PgAttributes name){ 
    if (name == null) return; 
    Platform.runLater(() -> { 
     if (name.getType().equals("Razza")) { 
      PgRazzaController razza = mainStage.showPgRazza(); 
      data.clear(); 
      data.add(new PgAttributes("Classe")); 

     } 
     if (name.getType().equals("Classe")) { 
      data.add(new PgAttributes("Caratteristiche")); 
     } 
    }); 
} 
関連する問題