Guten Tag Forum!
Ich beschäftige mich gerade mit einem JavaFX-Projekt und bin Anfänger.
Folgendes Ziel habe ich:
In der comboBoxLK1 soll aus der observableList "items" ein Element ausgewählt werden. Dieses gewählte Element soll dann aus der observableList "items" entfernt werden. Dann soll die comboBoxLK1 deaktiviert werden. Dann soll die comboBoxLK2 mit der aktualisierten observableList "items" aktiviert werden, um dann auch hier ein Element aus "items" zu wählen. Dies soll dann noch für weitere comboBoxen so durchgeführt werden.
Ich möchte also aus der observableList "items" kein fixes Element löschen, sondern das Element, das in der ComboBox gewählt wurde.
Dies scheint nicht richtig zu funktionieren. Mein Eindruck ist, dass beim Löschen die setonAction für die comboBox nochmals durchgeführt wird. In Schleife sozusagen.
Hier der Code:
Hier die Ausgabe der println auf der Console:
In der Console wird zunächst richtig ausgeben, dass die Farbe Rot gewählt wurde:
Selection made 1: [0] Rot
Dann wird nochmals die observablelist "items" ausgegeben:
[Rot, Gelb, Grün, Blau, Schwarz, Lila]
Dann aber scheint die setonAction-Routine nochmals zu starten, ohne dass ich in der Liste klicke, denn es wird nochmals die println ausgeführt:
Selection made 1: [-1] null
Und dann sieht man auch, dass das Löschen der zuvor gewählten Farbe (hier "Rot") auch über die Variable 'selectionIndexLK1' funktioniert, denn nun zeigt die println folgende Liste:
[Gelb, Grün, Blau, Schwarz, Lila]
Dann kommen die Fehlermeldungen mit ExceptionInThread...
Kann sich jemand dieses Verhalten erklären?
Wenn ich ein Element direkt aus der 'items'-Liste lösche (Zeilen 41 und 58 im Code aktiviert und Zeilen 40 und 57 deaktiviert), dann funktioniert es reibungslos ohne Fehlermeldungen. Aber ich will ja keine festen Elemente aus der Liste löschen sondern die zuvor gewählten.
Vielen Dank!
Ich beschäftige mich gerade mit einem JavaFX-Projekt und bin Anfänger.
Folgendes Ziel habe ich:
In der comboBoxLK1 soll aus der observableList "items" ein Element ausgewählt werden. Dieses gewählte Element soll dann aus der observableList "items" entfernt werden. Dann soll die comboBoxLK1 deaktiviert werden. Dann soll die comboBoxLK2 mit der aktualisierten observableList "items" aktiviert werden, um dann auch hier ein Element aus "items" zu wählen. Dies soll dann noch für weitere comboBoxen so durchgeführt werden.
Ich möchte also aus der observableList "items" kein fixes Element löschen, sondern das Element, das in der ComboBox gewählt wurde.
Dies scheint nicht richtig zu funktionieren. Mein Eindruck ist, dass beim Löschen die setonAction für die comboBox nochmals durchgeführt wird. In Schleife sozusagen.
Hier der Code:
Java:
ComboBox<String> comboBoxLK1 = new ComboBox<>();
ObservableList<String> items = FXCollections.observableArrayList();
items.addAll("Rot", "Gelb", "Grün", "Blau", "Schwarz", "Lila");
comboBoxLK1.setItems(items);
ComboBox<String> comboBoxLK2 = new ComboBox<>();
comboBoxLK2.setDisable(true);
comboBoxLK1.setOnAction((event) -> {
int selectionIndexLK1 = comboBoxLK1.getSelectionModel().getSelectedIndex();
Object selectionItemLK1 = comboBoxLK1.getSelectionModel().getSelectedItem();
System.out.println("Selection made 1: [" + selectionIndexLK1 + "] " + selectionItemLK1);
System.out.println(items);
comboBoxLK1.setDisable(true);
items.remove(selectionIndexLK1);
//items.remove("Grün");
System.out.println(items);
comboBoxLK1.setDisable(true);
comboBoxLK2.setItems(items);
comboBoxLK2.setDisable(false);
});
comboBoxLK2.setOnAction((event) -> {
int selectionIndexLK2 = comboBoxLK2.getSelectionModel().getSelectedIndex();
Object selectionItemLK2 = comboBoxLK2.getSelectionModel().getSelectedItem();
System.out.println("Selection made 2: [" + selectionIndexLK2 + "] " + selectionItemLK2);
System.out.println(items);
items.remove(selectionItemLK2);
//items.remove("Schwarz");
System.out.println(items);
comboBoxLK2.setDisable(true);
//comboBoxLK3.setItems(items);
//comboBoxLK3.setDisable(false);
});
Hier die Ausgabe der println auf der Console:
Code:
Selection made 1: [0] Rot
[Rot, Gelb, Grün, Blau, Schwarz, Lila]
Selection made 1: [-1] null
[Gelb, Grün, Blau, Schwarz, Lila]
Exception in thread "JavaFX Application Thread" java.lang.IndexOutOfBoundsException: Index -1 out of bounds for length 5
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:266)
at java.base/java.util.Objects.checkIndex(Objects.java:359)
at java.base/java.util.ArrayList.remove(ArrayList.java:504)
at javafx.base@19/com.sun.javafx.collections.ObservableListWrapper.doRemove(ObservableListWrapper.java:116)
at javafx.base@19/javafx.collections.ModifiableObservableListBase.remove(ModifiableObservableListBase.java:186)
at FirstJavaFXProject/application.Kurswahl.lambda$0(Kurswahl.java:40)
at javafx.base@19/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at javafx.base@19/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:234)
at javafx.base@19/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
In der Console wird zunächst richtig ausgeben, dass die Farbe Rot gewählt wurde:
Selection made 1: [0] Rot
Dann wird nochmals die observablelist "items" ausgegeben:
[Rot, Gelb, Grün, Blau, Schwarz, Lila]
Dann aber scheint die setonAction-Routine nochmals zu starten, ohne dass ich in der Liste klicke, denn es wird nochmals die println ausgeführt:
Selection made 1: [-1] null
Und dann sieht man auch, dass das Löschen der zuvor gewählten Farbe (hier "Rot") auch über die Variable 'selectionIndexLK1' funktioniert, denn nun zeigt die println folgende Liste:
[Gelb, Grün, Blau, Schwarz, Lila]
Dann kommen die Fehlermeldungen mit ExceptionInThread...
Kann sich jemand dieses Verhalten erklären?
Wenn ich ein Element direkt aus der 'items'-Liste lösche (Zeilen 41 und 58 im Code aktiviert und Zeilen 40 und 57 deaktiviert), dann funktioniert es reibungslos ohne Fehlermeldungen. Aber ich will ja keine festen Elemente aus der Liste löschen sondern die zuvor gewählten.
Vielen Dank!