JavaFX ComboBox - Display text but return ID on selection

后端 未结 2 1420
北海茫月
北海茫月 2021-02-06 06:32

I have a Database table with airports, each airport has a name and an ID.

In JavaFX I have a form, with a ComboBox, the combobox needs to display all the ai

相关标签:
2条回答
  • 2021-02-06 06:47

    Your Airport Class.. .

    public class Airport {
    
    private int id;
    private String name;
    
    public Airport(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
    
    public int getId() {
        return id;
    }
    
    public void setId(int id) {
        this.id = id;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    

    }// class Airport

    Create Observable list of Airport

    ObservableList<AirPort> airports = FXCollections.observableArrayList();
    airports.add(new Airport(1, "Beijing Capital International Airport"));
    airports.add(new Airport(2, "Los Angeles International Airport"));
    airports.add(new Airport(3, "London Heathrow Airport"));
    

    Set item of your combo box. .

    combo.setItems(airports);
    

    After this when you run your program you get the output like this. ..

    To get name of Airports you have to need to override toString method in Airport class.

    @Override
    public String toString() {
        return this.getName();
    }
    

    After this you will get output like.. .


    Now to get the id of selected airport you can set an event handler. .

    private void setEventOnAirport() {
        combo.setOnKeyReleased(event -> {
            if (event.getCode().equals(KeyCode.ENTER)) {
                Airport airport = combo.getSelectionModel().getSelectedItem();
                System.out.println(airport.getId());
            }
        });
    }
    

    By this function you can see the ID of selected Airport. . .

    0 讨论(0)
  • 2021-02-06 06:55

    You can create e.g. an AirPort class with ID and name members and a ComboBox that displays these objects: ComboBox<AirPort>.

    AirPort class:

    public class AirPort {
        private int ID;
        private String name;
    
        public AirPort(int id, String name) {
            this.ID = id;
            this.name = name;
        }
    
        public int getID() { return ID; }
        public String getName() { return name; }
    }
    

    Get the items from the DB and create the ComboBox:

    // Fill the list from the DataBase
    ObservableList<AirPort> airports = FXCollections.observableArrayList();
    airports.addAll(new AirPort(0, "Heathrow"), 
        new AirPort(1, "Frankfurt"),
        new AirPort(2, "NewYork"));
    
    ComboBox<AirPort> combo = new ComboBox<>();
    combo.setItems(airports);
    

    Finally to display the name of the objects you can use for example a StringConverter:

    combo.setConverter(new StringConverter<AirPort>() {
    
        @Override
        public String toString(AirPort object) {
            return object.getName();
        }
    
        @Override
        public AirPort fromString(String string) {
            return combo.getItems().stream().filter(ap -> 
                ap.getName().equals(string)).findFirst().orElse(null);
        }
    });
    

    And then when the value is changing you get back AirPort objects which contains the needed ID:

    combo.valueProperty().addListener((obs, oldval, newval) -> {
        if(newval != null)
            System.out.println("Selected airport: " + newval.getName() 
                + ". ID: " + newval.getID());
    });
    
    0 讨论(0)
提交回复
热议问题