2016-03-26 7 views
1

Ich habe eine ListView mit Elementen und entwickelt eine Löschfunktion, die das Element löscht. Das Problem, dem ich gegenüberstehe, ist, wenn ich einen Gegenstand lösche, wird der darunterliegende Gegenstand ebenfalls gelöscht.Löschen eines ausgewählten Elements in ListView in javafx

Um Ihnen ein besseres Verständnis zu geben. Beispiel:

Wenn ich 5 Elemente in einer Liste habe und ich "Element 2" auswähle und lösche, wird Element 2 & 3 gelöscht. Und Artikel 1, 4 & 5 bleibt in der Listenansicht. Wenn ich den letzten Punkt auf der Liste löschen, dann wird das Element gelöscht und ich bekomme ein java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

Hier ist mein Code:

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); 

      } 
     } 
    }); 
} 

Ich mag nur das ausgewählte Element gelöscht werden. Wie mache ich das? Und wie macht man den Tisch multi wählbar?

players ist die Liste der Player in der ListView verwendet.

+0

Was ist 'Spieler'? – fabian

+0

newSelectedIdx wird mit selectedIdx zugewiesen, wenn selectedIdx nicht der letzte Index ist. In diesem Szenario entfernen Sie das Element und wählen es aus. Sie erhalten dann indexOutofBoundsException, da kein Element mehr vorhanden ist. –

+0

@fabian Spieler ist die ObservableList mit der Listview verbunden –

Antwort

1

entfernen Sie 2 Elemente aus der Liste der folgenden Zeilen ein:

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

einen von ihnen entfernen.

Um die Mehrfachauswahl zu ermöglichen, setzen Sie MultipleSelectionModel.selectionMode auf SelectionMode.MULTIPLE.

+0

Aha, hab dich. Ich entschied mich, 'players.remove (selectedIdx);' zu verwenden und das andere zu entfernen. funktioniert super! –

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

       playerList.getItems().remove(selectedIdx); 
  1. Wie Sie einmal wird sehen können, newSelectedIdx zugewiesen, dann versuchen Sie selectedIdx zu entfernen. Manchmal ist newSelectedIdx das gleiche wie selectedIdx. Das ist der Grund, warum, obwohl Sie beabsichtigen, einen Gegenstand zu entfernen, ein anderer Gegenstand auch entfernt wird.
  2. Angenommen, Sie nur ein Element verlassen haben, werden Sie das Element entfernen und wählen Sie dann, Sie IndexOutOfBoundsException

Was bekommen Sie tun können, ist, dass die Logik Löschen in handleDeleteButton() isoliert werden konnte. Das Auswahlereignis könnte in einer anderen Methode gehandhabt werden, so dass Sie das Löschen und Auswählen in derselben Funktion nicht verwechseln.

+0

Ich sehe was du meinst, aber gerade nicht so sicher, wie man es löst. –