JavaFX Wert einer ChoiceBox bekommen ohne Lambdas

Richi888

Mitglied
Hallo Freunde,
bin blutiger Anfänger in Java, seit 3 Wochen versuche ich mich daran aber aller Anfang ist natürlich schwer 😉 Schonmal sorry für diese Anfängerfrage..

Es geht darum, dass ich den ausgewählten Wert meiner ChoiceBox die nur aus Strings besteht auslesen bzw. ausgeben möchte. Ich möchte es ohne Lambdas probieren um die Hintergründe zu verstehen. An diesem Punkt komme ich nicht weiter:

Java:
import javafx.application.Application;
import javafx.collections.ListChangeListener;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.control.Button;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.TextField;                    

public class Main extends Application {    

    public static void main(String[] args) {
        launch(args);                            
    }
                        
    @Override                                               
    public void start(Stage stage) throws Exception { 
    
        //BAUSTEINE:
        ChoiceBox<String> choiceBox = new ChoiceBox<String>();        
        choiceBox.getItems().addAll("Apfel", "Banane", "Birne");    
        choiceBox.setValue("Apfel");                                
    
        choiceBox.getSelectionModel().selectedIndexProperty().addListener(new ListChangeListener<Item>() {

        //HIER KOMME ICH NICHT WEITER, DA WÜRDE JA JETZT DAS MIT DEM LAMBDA KOMMEN ;)
     
            }
        
        });

    
        //LAYOUT:
        VBox vBox = new VBox();
        vBox.setPadding(new Insets(20,20,20,20));
        vBox.setSpacing(10);
        vBox.getChildren().addAll(choiceBox);                

    
        //EIGENSCHAFTEN DER SCENE:
        Scene scene = new Scene(vBox, 300, 250);
    
        //EIGENSCHAFTEN DER STAGE:
        stage.setScene(scene);
    
        //PROGRAMMSTART:
        stage.show();                                  
    }
}

Grüße
 
Müsste deine IDE dir nicht vorschlagen was dort hinein gehört? 🙂 Strg+Leertaste bzw Strg+1 auf die Fehlermeldung.
Sonst würde ich hier nachschauen:
http://docs.oracle.com/javafx/2/ui_controls/choice-box.htm

hm das beispiel ist für eine arraylist, beim auswählen eines items des drop down menüs gibt mir die console lediglich den index des ausgewählten items. ich benötige einen code der mir den wert des gewählten items ausgibt. also z.b. Apfel 🙂
 
Zuletzt bearbeitet:
Nervig das oracle die Codeschnipsel als Bilder gespeichert hat...

Also da du ja einen Listener auf selectedIndexProperty() registriert hast bekommst du in einem Event den Index für das Element, dass du in der ChoiceBox ausgewählt hast, zurück.
Anhand des Index kannst du dann aus der Liste das richtige Element auswählen.

Hab gerade kein Java8 zurhand, aber probiere mal an das valueProperty() den Listener zu hängen, dann solltest du keinen Index bekommen, sondern das konkrete Objekt. (String in deinem Fall)
 
Nervig das oracle die Codeschnipsel als Bilder gespeichert hat...

Also da du ja einen Listener auf selectedIndexProperty() registriert hast bekommst du in einem Event den Index für das Element, dass du in der ChoiceBox ausgewählt hast, zurück.
Anhand des Index kannst du dann aus der Liste das richtige Element auswählen.

Hab gerade kein Java8 zurhand, aber probiere mal an das valueProperty() den Listener zu hängen, dann solltest du keinen Index bekommen, sondern das konkrete Objekt. (String in deinem Fall)

Sorry ich versteh nicht genau was du meinst, welches valueProperty()? kannst du mir bitte den Code Schnipsel dazu aufschreiben so wie du es meinst?
 
Hi,
Das Problem in deinem Code ist: (Lambda brauchst du hier nicht; na ja, das kann auch mit Lamda gemacht werden; aber mein Beispiel ist ohne Lambda...)
Java:
choiceBox.getSelectionModel().selectedIndexProperty().addListener(new ListChangeListener<Item>() {
//HIER KOMME ICH NICHT WEITER, DA WÜRDE JA JETZT DAS MIT DEM LAMBDA KOMMEN ;)
    }
});
Den ListChangeListener musst du so implementieren:
Java:
choiceBox.valueProperty().addListener(new ChangeListener<String>() {
   @Override public void changed(ObservableValue ov, String oldString, String newString) {
     // was auch immer du dann mit dem selectedItem machst
     System.out.println(ov);
     System.out.println(oldString);
     System.out.println(newString);
   }  
});
Damit sollte es gehen...
 
Zuletzt bearbeitet:
Wenn du neu in Java bist, solltest du dich aber dennoch so schnell wie möglich auch mit den "moderneren" (in Anführungsstrichen, weil sie sehr lange gebraucht haben, das umzusetzen) Konzepten der Sprache auseinanderzusetzen. Auch wenn es natürlich sinnvoll ist, auch noch die alten Pattern zu kennen. Aber eben gerade Listener wie dieser hier sind prädestiniert für die Verwendung funktionaler Konzepte, wie Lambdas und Methoden-Referenzen (z.B. this::methodenName - wobei die Methode die identische Signatur wie der anonyme Listener, den dir @knilch hier gezeigt hat, haben muss - das gilt auch für das Lambda).
 
Woher weiss ich eigentlich welches Element (ChoiceBox, TextField, ComboBox, Buttons...) welchen Listener benötigt (ChangeListener, ListChangeListener..) oder ob ich dazu ActionEvent etc verwenden muss. Kommt das eigentlich irgendwann automatisch weil sich die Syntax einfach verinnerlicht oder lässt ihr das euch von der IDE immer geben oder schaut ihr einfach in der Java API?
 
Ich weiss nicht, wie die anderen das machen, aber ich lass mir da schon viel von der IDE helfen, dafür ist sie ja da. Speziell weil hier häufig generische Interfaces implementiert werden müssen, die häufig mit diesen spitzen Klammern "<>" parametriert sind.
 

Neue Themen


Zurück
Oben