JavaFX - Verhalten ComboBox

mihe7

Top Contributor
Es geht um eine eigentlich ganz simple Sache. Ich habe eine List<Person> und aus der soll der Anwender eine Person aussuchen. Person sieht so aus:
Java:
record Person(String name, String firstName) {}

Für solche Zwecke verwende ich normalerweise eine ComboBox. Also mal schnell eingebaut, dann noch einen Converter spendiert und was stelle ich fest? Das Ding verhält sich nicht wie eine ComboBox, bei der man einen Buchstaben (oder eine Folge von Buchstaben) eintippen kann, um mal schnell zu einem Eintrag zu springen. Das Teil reagiert überhaupt nicht (Pfeiltasten etc. funktionieren)

Frage 1: mache ich was falsch?

Das ist aber eigentlich Nebensache, denn ich wollte eine ComboBox mit Autovervollständung. Heißt: der Anwender sieht, was er eintippt und die Auswahlliste wird entsprechend gefiltert.

Frage 2: sehe ich das richtig, dass das standardmäßig nicht vorgesehen ist?

Das will ich gar nicht glauben aber wenn ich mich im Netz umschaue, dann ist das ernsthaft so gedacht, dass ich dafür jetzt seitenweise Code einbauen soll. Dazu hatte ich jetzt keine Lust, also nehme ich die SearchableComboBox von ControlsFX, mit der komme ich der Sache schon etwas näher. Allerdings wird der ausgewählte Wert nicht übernommen und dann wäre da noch die Frage, wie ich die Liste nach meinen Vorstellungen filtern kann. Von Haus aus wird anscheinend mit einem contains gefiltert, ich bräuchte ein startsWith.

Versionen:
XML:
        <java.version>21</java.version>
        <javafx.version>23.0.2</javafx.version>
        <controlsfx.version>11.2.2</controlsfx.version>

Wäre schön, wenn jemand die Antworten kurz aus dem Ärmel schütteln könnte, aber bitte keinen Aufwand betreiben.
 

KonradN

Super-Moderator
Mitarbeiter
Also nicht direkt zu Frage1 und Frage2 aber evtl. eine Möglichkeit bezüglich:
dann wäre da noch die Frage, wie ich die Liste nach meinen Vorstellungen filtern kann. Von Haus aus wird anscheinend mit einem contains gefiltert, ich bräuchte ein startsWith.
Ja, die Controls sind alle etwas blöd. Das ist einfach ein gutes Beispiel für schlecht durchdachte Controls. Es wäre doch eigentlich trivial, da etwas wie ein setPredicate einzuführen, das dann eine eigene Filter Routine enthalten kann und das halt per default ein Check auf contains hat beim angezeigten Text. Aber das könnte ja auch viel Komplexer gewünscht sein ...

Aber ok, hier muss man dann vermutlich selbst etwas Hand anlegen. Evtl. wäre etwas in der Art hilfreich (Ungeprüft von ChatGPT ... ist hoffentlich nicht erstunken und erlogen :) ):
Java:
AutoCompletePopup<String> popup = new AutoCompletePopup<>();
popup.getSuggestions().addAll("Apfel", "Ananas", "Banane", "Birne");

popup.setFilter((suggestion, text) ->
    suggestion.toLowerCase().startsWith(text.toLowerCase())
);

TextField editor = new TextField();
popup.setAutoFix(true);
popup.setHideOnEscape(true);
popup.setHideOnClickOutside(true);

editor.textProperty().addListener((obs, oldText, newText) -> {
    if (newText.isEmpty()) {
        popup.hide();
    } else {
        popup.show(editor);
    }
});

Aber da hat man dann nicht die Möglichkeiten, die man sonst so gerne haben möchte beim Verhalten....

Eine andere Idee wäre, bei der ComboBox<T> einfach die Liste der Elemente zu pflegen. Du reagierst also auf Eingaben und entfernst Einträge bzw. fügst diese wieder hinzu ... Das hat ChatGPT mir mal so als Code entwickelt:
Java:
// ===== FilterComboBoxExample.java =====
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class FilterComboBoxExample extends Application {

    @Override
    public void start(Stage stage) {
        // Master-Liste (alle Elemente)
        ObservableList<String> masterList = FXCollections.observableArrayList(
            "Apfel", "Ananas", "Banane", "Birne", "Avocado", "Orange"
        );

        // ComboBox mit leerer Startliste
        ComboBox<String> comboBox = new ComboBox<>();
        comboBox.setEditable(true);
        comboBox.getItems().setAll(masterList); // Initial alle anzeigen

        TextField editor = comboBox.getEditor();

        // Reagiere auf Texteingabe
        editor.textProperty().addListener((obs, oldText, newText) -> {
            String lower = newText.toLowerCase();
            comboBox.getItems().setAll(
                masterList.filtered(item -> item.toLowerCase().startsWith(lower))
            );
            comboBox.show(); // Zeige aktualisierte Dropdown-Liste
        });

        // Stelle sicher, dass die Liste zurückgesetzt wird, wenn ein Eintrag ausgewählt wurde
        comboBox.valueProperty().addListener((obs, oldVal, newVal) -> {
            if (newVal != null) {
                comboBox.getItems().setAll(masterList);
            }
        });

        VBox root = new VBox(10, comboBox);
        Scene scene = new Scene(root, 300, 200);
        stage.setScene(scene);
        stage.setTitle("Filter-ComboBox (startsWith)");
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

Und um dann doch noch meine Sicht auf Frage 1 und 2 kurz zu schildern:
Ja - leider läuft es hier wohl auf sowas hinaus. Du machst da aus meiner Sicht nichts falsch. Wenn Du beruflich mit JavaFX UIs erstellen musst, dann wäre es vermutlich sogar hilfreich, einfach mal eine eigene Library mit Controls zu erstellen. Alleine schon das Thema Grids ist in meinen Augen ein Horror ....
Und da fehlt dann auch ein einfacher Weg, sowas zu bewerkstelligen. Ich würde mir hier nicht nur Controls sondern Komponenten wünschen, wie man es von anderen Frameworks (die nicht auf Java basieren!) kennt.
 

mihe7

Top Contributor
Erstmal vielen Dank.

ist hoffentlich nicht erstunken und erlogen
Zumindest gibt es kein setFilter 🤣 TextFields.bindAutoCompletion funktioniert. Allerdings sollte man vorher alles in Strings umwandeln, sonst sieht das am Ende so aus:

1746398368641.png

und nach der Auswahl:

1746399266598.png

Eine andere Idee wäre, bei der ComboBox<T> einfach die Liste der Elemente zu pflegen.
Das scheint mir doch wesentlich praktischer zu sein.

1746400546985.png

Die Namen sind natürlich fitkiv.

Doch halt... Hat man einmal ein Element ausgewählt und löscht dann wieder Text, so dass man wieder mehrer Matches hat, sieht es so aus:
1746400504253.png

:mad:

Das bekommt man weg, indem man noch comboBox.autosize() vor combobox.show() einfügt.

Aber es kommt noch "besser": wenn man einmal etwas ausgewählt hat und dann Änderungen vornimmt, gibt es lustige Exceptions. ArrayIndexOutOfBoundsException, oder "Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: The start must be <= the end"

Und ganz lustig: wenn man noch nichts ausgewählt hat, funktionieren die Pfeiltasten nach oben bz.w unten nicht. Hat man aber einmal etwas ausgewählt, bearbeitet dann den Text erneut und drückt auf eine dieser Pfeiltasten, dann wird die Liste ersetzt - die enthält dann nur noch den ursprünglich ausgewählten Eintrag.

Wenn Du beruflich mit JavaFX UIs erstellen musst
Dann müsste ich mich erschießen.
 

KonradN

Super-Moderator
Mitarbeiter
Es ist erstaunlich, wie ChatGPT neue APIs erfindet ... Das sehe ich jetzt nicht das erste Mal. Sorry, dass ich diese erste Idee nicht genauer geprüft habe ...

Die Probleme bei der zweiten Lösung sind natürlich blöd. An die Fälle hatte ich nicht gedacht und das macht die Erstellung des Controls dann noch deutlich komplexer. Man muss halt dann noch die Tasten selbst verwalten:
  • Man muss einen eigenen Filter-Text verwalten, der halt nur angepasst wird, wenn der User die Eingabe aktiv verändert hat (Also die Änderung nicht durch die Pfeiltaste erfolgt ist).
  • Bei der Anpassung des Filters muss die Selektion aktiv angepasst werden (Mich wundert, dass dies nicht bereits im Control enthalten ist. Das ist doch eigentlich ein Standard Verhalten, das jederzeit auftreten könnte. Man hat ein Binding zu einer ObservableList und dann ändert sich die Liste während ein Element selektiert war ... Hier wäre meine Erwartungshaltung, dass der Fall bereits berücksichtig wäre ...)
 

mihe7

Top Contributor
Kein Problem. Man kennt das ja von ChatGPT :)

Ich mache das jetzt mit einem TextField als Filter für eine stinknormale ListView. Das ist ja alles ein Witz. Hoffentlich brauche ich das nicht noch an einer anderen Stelle...

Hintergrund: das wird für einen Bekannten ein kleines Erfassungstool für einen Wettbewerb; der Teilnehmerkreis ist vorab bekannt, die Leute kommen und erhalten einen Laufzettel mit Nummer (handschriftlich). Die Zuordnung der Laufnummer zum Teilnehmer muss dann zunächst erfasst werden und um Fehler möglichst auszuschließen, soll auf die bereits bekannten Teilnehmer zurückgegrifen werden. Eine Liste alleine ist allerdings zu wenig, da sucht man sich bei 80 bis 100 Teilnehmern ggf. einen Wolf. Nach der Teilnahme werden die Ergebnisse eingetragen und am Ende soll wenigstens eine Auswertung, sortiert nach Laufnummer, gedruckt werden. Nichts großes, deshalb dachte ich mir, das sollte ja mit FX kein Problem sein...
 

KonradN

Super-Moderator
Mitarbeiter
Hoffentlich brauche ich das nicht noch an einer anderen Stelle...
Dann müssen wir die "Java Forum FX Controls Library" als Projekt starten :)

Nichts großes, deshalb dachte ich mir, das sollte ja mit FX kein Problem sein...
Ja, das kann ich gut nachvollziehen. Aber sowas ist halt immer ein Problem, so lange keine guten Controls vorhanden sind. Das zurückgreifen auf Basis Controls ist da wohl mit das Beste denke ich mal. Ich bin immer froh über gute Control Libraries und mache das zu einem extrem wichtigen Punkt bei der Auswahl von UI Grundlagen. Alles Andere wird sonst sehr schnell zu einer extremen Tortur.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Hatsi09 JavaFx Mediaplayer seltsames Verhalten AWT, Swing, JavaFX & SWT 0
A JavaFX-Applikation als Maven-Projekt : JavaFX-Archetypen AWT, Swing, JavaFX & SWT 9
T JavaFX JavaFX, Dialoggröße in Gnome AWT, Swing, JavaFX & SWT 3
B Eclipse RCP (e4) Anwendung mit JavaFX / e(fx)clipse - Upgrade Probleme AWT, Swing, JavaFX & SWT 2
H JavaFX JAVA_HOME bei javaFX AWT, Swing, JavaFX & SWT 3
H JavaFX javafx-jdk einbinden AWT, Swing, JavaFX & SWT 5
C JavaFX In Eclipse ein JavaFX-Projekt mit Maven aufsetzen AWT, Swing, JavaFX & SWT 4
A JavaFX JavaFX images per Drag&Drop verschieben AWT, Swing, JavaFX & SWT 1
Juelin Javafx hängt sich auf AWT, Swing, JavaFX & SWT 31
Juelin StringGrid in SceneBuilder und javaFX AWT, Swing, JavaFX & SWT 3
Juelin starten maven javafx programm ohne netbeans AWT, Swing, JavaFX & SWT 38
Juelin javax.swing in javafx AWT, Swing, JavaFX & SWT 1
MiMa JUnit5 im JavaFX Projekt AWT, Swing, JavaFX & SWT 2
Juelin in javafx Event auslösen AWT, Swing, JavaFX & SWT 4
MiMa Fonts, Icons, Bilder in JavaFX Anwendung AWT, Swing, JavaFX & SWT 5
MiMa SwingFXUtils in JavaFX 20 AWT, Swing, JavaFX & SWT 6
MiMa JavaFX Fenstertitel zu klein. AWT, Swing, JavaFX & SWT 1
MiMa JavaFX JAR unter Windows ausführen schlägt fehl? AWT, Swing, JavaFX & SWT 5
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
Hatsi09 Javafx MediaPlayer spielt nicht immer AWT, Swing, JavaFX & SWT 3
Hatsi09 Javafx Neuladen von ImageView und MediaView AWT, Swing, JavaFX & SWT 3
Maxim6394 JavaFX Umlaute in JavaFX GUI AWT, Swing, JavaFX & SWT 12
Maxim6394 JavaFX Scene Builder - Crash bei eigener Komponente AWT, Swing, JavaFX & SWT 2
Ernesto95 JavaFX JavaFX GUI mit sehr vielen Update requests AWT, Swing, JavaFX & SWT 4
Telisti Javafx Image wird nicht richtig integiert AWT, Swing, JavaFX & SWT 8
J Netbeans die JavaFX-Anwendung wird nicht ausgeführt AWT, Swing, JavaFX & SWT 16
MartinNeuerlich Kann mir jemand, der einen Mac mit einem m1 oder m2-Chip hat, eine POM geben mit der Javafx-Fullscreen beim Mac mit m-Chip funktioniert? AWT, Swing, JavaFX & SWT 1
tommybalbor JavaFx Anwendung klappt nicht für macOs Nutzern, wenn ich zwei dependecies bei maven hinzufüge AWT, Swing, JavaFX & SWT 6
JavaSchmecktLecker JavaFX JavaFX Ordner automatisch verlinken AWT, Swing, JavaFX & SWT 2
melaniemueller Taschenrechner JavaFX AWT, Swing, JavaFX & SWT 4
R auto. Importanweisungen für javafx funktioniert in Eclipse nicht mehr AWT, Swing, JavaFX & SWT 4
thor_norsk JavaFX Anwendung stürzt ab AWT, Swing, JavaFX & SWT 4
berserkerdq2 Skalieren sich javafx objekte automatisch auf die Bildschirmgröße AWT, Swing, JavaFX & SWT 6
berserkerdq2 Wie füge ich ein Bild in javafx mit dem Scenebuilder ein, das automatisch mitgezogen wird, wenn das Fenster vergrößert wird oder Vollbildmodus AWT, Swing, JavaFX & SWT 6
B Java Projekt mit JavaFX und jfoenix ausführbar machen AWT, Swing, JavaFX & SWT 46
H JavaFX wie JavaFX Projekt aufsetzen? AWT, Swing, JavaFX & SWT 10
thor_norsk JavaFX - Grafikkarte AWT, Swing, JavaFX & SWT 7
MiHimbert Rückmeldung an den aufrufenden JAVAFX-Dialog AWT, Swing, JavaFX & SWT 1
MiMa JavaFX Runtime components are Missing??? AWT, Swing, JavaFX & SWT 3
J JavaFx PDF in einem Element in einem Fenster anzeigen. AWT, Swing, JavaFX & SWT 11
B JavaFX Sprachumschaltung mit Button auf der HMI AWT, Swing, JavaFX & SWT 6
H JavaFX Fehlende JavaFX Package AWT, Swing, JavaFX & SWT 10
K JavaFX unterschiedliche (mehrere Fenster) in seperater Main Methode AWT, Swing, JavaFX & SWT 26
G Kann man ein 2. JavaFX-Fenster auch beenden (exit) statt schließen (close) lassen? AWT, Swing, JavaFX & SWT 8
G JavaFX Line Chart mit Farbverlauf/Gradient in Linie AWT, Swing, JavaFX & SWT 1
thor_norsk JavaFX, FXML und SceneBuilder AWT, Swing, JavaFX & SWT 6
G Über installDist exportiertes Programm wirft "Unsupported JavaFX configuration" AWT, Swing, JavaFX & SWT 0
CodingBerlin JavaFX Programm läuft nur unter Eclipse AWT, Swing, JavaFX & SWT 1
H Fehler: Zum Ausführen dieser Anwendung benötigte JavaFX-Runtime-Komponenten fehlen AWT, Swing, JavaFX & SWT 44
temi JavaFX "Frames" in JavaFx - passende Komponente? AWT, Swing, JavaFX & SWT 13
G JavaFX Steuerung bzw. Test von externer JavaFX Anwendung (liegt nur als jar vor) AWT, Swing, JavaFX & SWT 9
G [JavaFX] Spinner so einstellen, dass er nicht leer bleiben darf? AWT, Swing, JavaFX & SWT 6
S Javafx getResource-Pfad wird nicht erkannt AWT, Swing, JavaFX & SWT 7
A JavaFX exportierte Jar ohne beim starten die Libs hinzufügen? AWT, Swing, JavaFX & SWT 2
J JavaFX Schiffe versenken mit JavaFX und Scene builder AWT, Swing, JavaFX & SWT 3
Encera ArrayList mit eigenen Objekten in JavaFX sortieren und ausgeben AWT, Swing, JavaFX & SWT 50
L JavaFx Textformatierung mittels Datenbank und Funktion anpassen AWT, Swing, JavaFX & SWT 5
sserio Wie funktioniert ein Controller bei JavaFx? AWT, Swing, JavaFX & SWT 1
sserio Kann man bei JavaFx ein Fenster aufkommen lassen? AWT, Swing, JavaFX & SWT 1
Jose05 JavaFx Fxml: GUI aus einer anderen Klasse starten AWT, Swing, JavaFX & SWT 1
Tassos JavaFX/Problem mit der Maussteuerung in Stackpane AWT, Swing, JavaFX & SWT 7
S Ich bringe Code mit JavaFX unter Apache NetBeans IDE 12.6 nicht zum laufen. AWT, Swing, JavaFX & SWT 14
K Bekomme (u.a) javafx.fxml.LoadException trotz "korrektem" Code AWT, Swing, JavaFX & SWT 8
S JavaFX: voneinander abhängige TextFields AWT, Swing, JavaFX & SWT 33
M Gluon will JavaFX in den Browser stecken AWT, Swing, JavaFX & SWT 0
H javafx application does not exist AWT, Swing, JavaFX & SWT 16
A JavaFX Controller Problem AWT, Swing, JavaFX & SWT 1
izoards JavaFX TableView mit Array Inhalt füllen AWT, Swing, JavaFX & SWT 1
M Javafx versuch Bibliothek zu erstellen AWT, Swing, JavaFX & SWT 0
N JavaFX Javafx intelij Projekt zu ausführbaren jar Datei Machen AWT, Swing, JavaFX & SWT 1
K JavaFx, Sound Aufnahme und Thread AWT, Swing, JavaFX & SWT 0
izoards JavaFX TextFlow - Sonderzeichen AWT, Swing, JavaFX & SWT 1
maximstein JavaFX WebView - java.lang.NoSuchMethodError: 'boolean com.sun.prism.ResourceFactory.isDisposed()' AWT, Swing, JavaFX & SWT 4
N JavaFX Unicode zeichnen in javafx Label verwenden AWT, Swing, JavaFX & SWT 2
MiHimbert javaFX openfx (17) datepicker AWT, Swing, JavaFX & SWT 3
A Mit JavaFX einzelne Zeilen in TableView farbig markieren AWT, Swing, JavaFX & SWT 5
melaniemueller JavaFX Taschenrechner mit SceneBuilder AWT, Swing, JavaFX & SWT 12
Jose05 Javafx Label Höhe=Breite AWT, Swing, JavaFX & SWT 1
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
izoards JavaFX editierbare Tabelle AWT, Swing, JavaFX & SWT 4
N javafx Position der Bustaben finden label AWT, Swing, JavaFX & SWT 1
D Verschieden Scenen ansprechen mit dem Scene Builder und JavaFX (Eclipse) AWT, Swing, JavaFX & SWT 16
izoards JavaFX Background Task warten auf Knopfdruck AWT, Swing, JavaFX & SWT 4
M Zufallsgenerator bei JavaFx AWT, Swing, JavaFX & SWT 1
N Label Schriftart Ändern javafx AWT, Swing, JavaFX & SWT 2
L JavaFX JavaFX, MVVM und SceneBuilder AWT, Swing, JavaFX & SWT 4
S JavaFx Album AWT, Swing, JavaFX & SWT 137
I JavaFX - Pane wechseln über 2. Controller AWT, Swing, JavaFX & SWT 5
melaniemueller JavaFX Beispiel kann nicht ausgeführt werden AWT, Swing, JavaFX & SWT 4
T FXML Datei in Java Code einbinden: javafx.fxml.LoadException AWT, Swing, JavaFX & SWT 2
J JavaFX - Included FXML - Entfernen feststellen AWT, Swing, JavaFX & SWT 2
J JavaFX JavaFX/ Taskmenu / UML Klassendiagramm AWT, Swing, JavaFX & SWT 2
Davee JavaFX JavaFX Jar ausführbar jedoch nicht alle Stages AWT, Swing, JavaFX & SWT 3
2 JavaFX die ChoiceBox leitet den String nicht weiter oder es komm zu einem NullPointer AWT, Swing, JavaFX & SWT 8
C MouseEvent JavaFX AWT, Swing, JavaFX & SWT 4
L JavaFX javafx.fxml.LoadException bei einem Taschenrechner AWT, Swing, JavaFX & SWT 5
M4cM4rco0707 JavaFX Custom-Komponente mit Custom-Controller AWT, Swing, JavaFX & SWT 3
M Error occurred during initialization of boot layer java.lang.module.FindException: Module javafx.controls not found AWT, Swing, JavaFX & SWT 14
G javafx build.fxbuild in eclipse und ANT AWT, Swing, JavaFX & SWT 9
M Kollisionensbehandlung mit JavaFX AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen

Neue Themen


Oben