2016-03-26 43 views
1

私は項目がListViewであり、項目を削除するdelete関数を開発しました。私が直面している問題は、アイテムを削除すると、下のアイテムも削除されます。javafxのListViewで選択した項目を削除する

より理解を深めるためです。例:

リストに5つのアイテムがあり、「アイテム2」を選択して削除すると、アイテム2 & 3が削除されます。また、項目1,4,5がリストビューに残ります。私は、リスト上の最後の項目を削除した場合、アイテムは削除されると、私はここでjava.lang.IndexOutOfBoundsException: Index: 0, Size: 0

を得る私のコードです:

public void handleDeleteButton() { 
    btnDelete.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent event) { 
      final int selectedIdx = playerList.getSelectionModel().getSelectedIndex(); 
      if (selectedIdx != -1) { 
       String itemToRemove = playerList.getSelectionModel().getSelectedItem(); 

       final int newSelectedIdx = 
         (selectedIdx == playerList.getItems().size() - 1) 
           ? selectedIdx - 1 
           : selectedIdx; 

       playerList.getItems().remove(selectedIdx); 
       playerList.getSelectionModel().select(newSelectedIdx); 
       //removes the player for the array 
       System.out.println("selectIdx: " + selectedIdx); 
       System.out.println("item: " + itemToRemove); 
       players.remove(selectedIdx); 

      } 
     } 
    }); 
} 

私は唯一の選択した項目を削除することにしたいです。それ、どうやったら出来るの?そして、どのようにしてテーブルを複数選択可能にしますか?

playersは、ListViewで使用されているプレーヤーの一覧です。

+0

「選手」とは何ですか? – fabian

+0

selectedIdxが最後のインデックスでない場合、newSelectedIdxはselectedIdxで割り当てられます。したがって、このシナリオでは、その項目を削除してから選択すると、要素が残っていないため、indexOutofBoundsExceptionが発生します。 –

+0

@fabianのプレイヤーはobservableListですはリストビューに接続されています –

答えて

1

次の行を使用して、リストから2つの項目を削除:

playerList.getItems().remove(selectedIdx); 
     //^this should return players 
players.remove(selectedIdx); 

が、そのうちの一つを削除してください。

複数選択を許可するには、MultipleSelectionModel.selectionModeSelectionMode.MULTIPLEに設定します。

+0

ああ、あなたを持ってきました。私は 'players.remove(selectedIdx);を使い、もう一方を削除することにしました。よく働く! –

0
final int newSelectedIdx = 
         (selectedIdx == playerList.getItems().size() - 1) 
           ? selectedIdx - 1 
           : selectedIdx; 

       playerList.getItems().remove(selectedIdx); 
  1. あなたが見ることができるようにnewSelectedIdxが割り当てられると、その後、あなたはselectedIdxを削除してみてください。場合によってはnewSelectedIdxselectedIdxと同じになります。その理由は、あなたが1つのアイテムを削除しようとしても、他のアイテムも削除される理由です。
  2. あなたは左の項目を1つだけ持っていると仮定し、あなたはその項目を削除して、それを選択します、あなたは何ができるかはIndexOutOfBoundsException

を取得します)(削除ロジックがhandleDeleteButtonで単離することができることです。選択イベントは、他のいくつかのメソッドで処理される可能性があります。そのため、削除と同じ機能での選択を混在させることはありません。

+0

あなたは何を意味しているのか分かりませんが、それを解決する方法はあまり分かりません。 –

関連する問題