Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Combo-box key value pair in JavaFX 2

Tags:

I am just starting to learn JavaFX 2.
Now I am trying to build a sample application. Then I got stuck in combobox.
I did not find any reference to key value pair for combobox in JavaFX.
The combobox javadoc at http://docs.oracle.com/javafx/2/api/index.html does not say much about key value pair.

How can I create a combobox that has items which have different display value and actual value ?

like image 592
Shrestha Avatar asked May 22 '12 09:05

Shrestha


People also ask

What is a combo box JavaFX?

ComboBox is a part of the JavaFX library. JavaFX ComboBox is an implementation of simple ComboBox which shows a list of items out of which user can select at most one item, it inherits the class ComboBoxBase. Constructors of ComboBox: ComboBox(): creates a default empty combo box.

What is the difference between ComboBox and ChoiceBox JavaFX?

The JavaFX ComboBox control enables users to choose an option from a predefined list of choices, or type in another value if none of the predefined choices matches what the user want to select. The JavaFX ChoiceBox control enables users to choose an option from a predefined list of choices only.


1 Answers

You have 2 approaches:
1. Simply override the toString() method in your datamodel class. Example:

public class Demo extends Application {      private final ObservableList<Employee> data =             FXCollections.observableArrayList(             new Employee("Azamat", 2200.15),             new Employee("Veli", 1400.0),             new Employee("Nurbek", 900.5));      @Override     public void start(Stage primaryStage) {          ComboBox<Employee> combobox = new ComboBox<>(data);         combobox.getSelectionModel().selectFirst(); // Select first as default         combobox.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Employee>() {              @Override             public void changed(ObservableValue<? extends Employee> arg0, Employee arg1, Employee arg2) {                 if (arg2 != null) {                     System.out.println("Selected employee: " + arg2.getName());                 }             }         });         StackPane root = new StackPane();         root.getChildren().add(combobox);         primaryStage.setScene(new Scene(root, 300, 250));         primaryStage.show();     }      public static class Employee {         private String name;         private Double salary;          @Override         public String toString() {             return name + " (sal:" + salary + ")";         }          public Employee(String name, Double salary) {             this.name = name;             this.salary = salary;         }          public String getName() {             return name;         }          public void setName(String name) {             this.name = name;         }          public Double getSalary() {             return salary;         }          public void setSalary(Double salary) {             this.salary = salary;         }     }      public static void main(String[] args) {         launch(args);     } } 

Note the overriden toString() of the Employee class. The combobox's key (actual value) will be the Employee instance and the display value is employee.toString() in this case.
2. Second approach is to set cellFactory property of the combobox.

combobox.setCellFactory(new Callback<ListView<Employee>, ListCell<Employee>>() {      @Override     public ListCell<Employee> call(ListView<Employee> arg0) {         return new ListCell<Employee>() {              private final Button btn;             {                 setContentDisplay(ContentDisplay.GRAPHIC_ONLY);                 btn = new Button();             }              @Override             protected void updateItem(Employee item, boolean empty) {                 super.updateItem(item, empty);                  if (item == null || empty) {                     setGraphic(null);                 } else {                     btn.setStyle(item.getSalary() > 1000 ? "-fx-base:red" : "-fx-base: green");                     btn.setText(item.getName() + "=" + item.getSalary());                     setGraphic(btn);                 }             }         };     } }); 

This approach gives more powerful control over cell rendering. You can not just format display value but also include any node (control) into cell (button in this case) and add some viewing logic (item.getSalary()?"":"") too. The actual value remains the same ie Employee instance.

like image 163
Uluk Biy Avatar answered Sep 19 '22 14:09

Uluk Biy