2016-03-26 6 views
1

У меня есть ListView с элементами и разработана функция удаления, которая удаляет элемент. Проблема Im сталкивается, когда я удаляю элемент, элемент ниже также удаляется.Удаление выбранного элемента в ListView в javafx

Чтобы лучше понять ситуацию. ex:

Если у меня есть 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

newSelectedIdx присваивается выбранным идентификатором, если выбраноIdx не является последним индексом. Итак, в этом случае вы удалите этот элемент, а затем выберите его, вы получите indexOutofBoundsException, так как не останется ни одного элемента. –

+0

@fabian players is observableList подключился к списку –

ответ

1

Вы удаляете 2 пунктов из списка, используя следующие строки:

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

Удалите один из них.

Чтобы разрешить множественный выбор, установите MultipleSelectionModel.selectionMode на SelectionMode.MULTIPLE.

+0

Ага, ты. Я решил использовать 'players.remove (selectedIdx);' и удалить другой. прекрасно работает! –

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

       playerList.getItems().remove(selectedIdx); 
  1. Как вы можете видеть, как только newSelectedIdx назначается, то вы пытаетесь удалить selectedIdx. Иногда newSelectedIdx будет таким же, как selectedIdx. Именно поэтому, даже если вы намерены удалить один элемент, другой элемент также удаляется.
  2. Предположим, у вас есть только один элемент влево, вы удалите этот элемент, а затем выберите его, вы получите IndexOutOfBoundsException

Что вы могли бы сделать то, что удаление логики могут быть выделены в handleDeleteButton(). Событие выбора может быть обработано каким-либо другим способом, так что вы не будете смешивать удаление и выбирать одну и ту же функцию.

+0

Я понял, что вы имеете в виду, но просто не так уверен, как его решить. –

Смежные вопросы