2012-05-22 15 views
15

में कॉम्बो-बॉक्स कुंजी मूल्य जोड़ी मैं जावाएफएक्स 2.
सीखना शुरू कर रहा हूं अब मैं नमूना आवेदन बनाने की कोशिश कर रहा हूं। तब मैं combobox में फंस गया।
मुझे JavaFX में combobox के लिए कुंजी मान जोड़ी का कोई संदर्भ नहीं मिला।
http://docs.oracle.com/javafx/2/api/index.html पर combobox javadoc कुंजी मूल्य जोड़ी के बारे में बहुत कुछ नहीं कहता है।जावाएफएक्स 2

मैं एक combobox कैसे बना सकता हूं जिसमें आइटम अलग-अलग प्रदर्शन मूल्य और वास्तविक मान हैं?

+0

क्या आपने [कॉम्बो बॉक्स पर ट्यूटोरियल] देखा है (http://docs.oracle.com/javafx/2/ui_controls/combo-box.htm)? – assylias

+0

@ वासिलियास - हाँ मैंने किया। इसमें मुख्य मूल्य जोड़ी के साथ कॉम्बो-बॉक्स बनाने के बारे में कुछ भी उल्लेख नहीं है, इसमें कुछ आइटमों के साथ एक सादा कॉम्बो-बॉक्स है। –

उत्तर

17

आपके पास 2 दृष्टिकोण हैं:
1. बस अपने डेटामोडेल कक्षा में toString() विधि को ओवरराइड करें। उदाहरण:

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); 
    } 
} 

कर्मचारी वर्ग के ओवर्रिडेन टूस्ट्रिंग() पर ध्यान दें। Combobox की कुंजी (वास्तविक मान) Employee उदाहरण होगी और इस मामले में प्रदर्शन मान employee.toString() है।
2. दूसरा दृष्टिकोण 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); 
       } 
      } 
     }; 
    } 
}); 

यह दृष्टिकोण सेल प्रतिपादन पर अधिक शक्तिशाली नियंत्रण प्रदान करता है। आप केवल प्रदर्शन मूल्य को प्रारूपित नहीं कर सकते हैं बल्कि सेल में किसी भी नोड (नियंत्रण) को भी शामिल कर सकते हैं (इस मामले में बटन) और कुछ देखने तर्क (item.getSalary()? "": "") भी जोड़ें। वास्तविक मूल्य वही रहता है अर्थात कर्मचारी उदाहरण।

+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद। यह वही था जो मैं ढूंढ रहा था। मैंने इसमें एक छोटा बदलाव किया ताकि यह सूची –

+0

में बटन रखने के बजाय सामान्य कॉम्बो-बॉक्स जैसी वस्तुओं को प्रदर्शित करे, यह कैसे दिखता है कि हम हमारी कुंजी-मूल्य जोड़ी के लिए हैशपैप का उपयोग कर रहे थे? क्या यह अनावश्यक 'सार्वजनिक शून्य बदल गया है (ObservableValue > arg0, मानचित्र <स्ट्रिंग, स्ट्रिंग> arg1, मानचित्र <स्ट्रिंग, स्ट्रिंग> arg2) {} '? –

10

एक और समाधान है, StringConverter लागू करना। यह वस्तुओं के लिए बहुत उपयोगी है:

public class Producto { 

private String codigo; 
private String nombre; 

public Producto(String codigo, String nombre) { 
    this.codigo = codigo; 
    this.nombre = nombre; 
} 

public String getCodigo() { 
    return codigo; 
} 

public void setCodigo(String codigo) { 
    this.codigo = codigo; 
} 

public String getNombre() { 
    return nombre; 
} 

public void setNombre(String nombre) { 
    this.nombre = nombre; 
} 

}

कनवर्टर कार्यान्वयन:

public class ProductoConverter extends StringConverter<Producto> { 

/** Cache de productos */ 
private Map<String, Producto> mapProductos = new HashMap<String, Producto>(); 

@Override 
public String toString(Producto producto) { 
    mapProductos.put(producto.getCodigo(), producto); 
    return producto.getNombre(); 
} 

@Override 
public Producto fromString(String codigo) { 
    return mapProductos.get(codigo); 
} 

} दृश्य पर

कोड:

ComboBox<Producto> cboProductos = new ComboBox<Producto>; 
    cboProductos.setConverter(new ProductoConverter()); 
    cboProductos.getItems().addAll(serviciosMgr.getListaProductos()); 

का मूल्य प्राप्त करने के लिए उत्पाद, आप getValue() विधि कॉल कर सकते हैं:

cboProductos.getValue() 
+3

अंग्रेजी सहायक होगी! –

0

मुझे पता है कि इस सवाल का पुराना है, लेकिन क्योंकि मैं तो बस इस मुद्दे पर व्यर्थ खुदाई में घंटे बिताए यह मेरे परिणामों को साझा करने के लिए अनिवार्य का एक प्रकार है। ऐसा लगता है कि ओवरब्रिन टूस्ट्रिंग() विधि के साथ कॉम्बोबॉक्स सूची में स्ट्रिंग डुप्लिकेट होने पर भी तारों को स्ट्रिंग्स को ठीक से हल करता है। संकल्प सूचकांक आधारित होना चाहिए और toString() केवल प्रस्तुति के लिए उपयोग किया जाता है।

संबंधित मुद्दे