2012-11-13 18 views
11

ओवरराइड किए बिना जावाएफएक्स 2 के कॉम्बो बॉक्स के साथ एक पीओजेओ प्रस्तुत करना मेरे पास उन कर्मचारियों की एक सूची है जिनके नाम मुझे उपयोगकर्ता के चयन के लिए कॉम्बो बॉक्स पर प्रस्तुत करने की आवश्यकता है। निम्नलिखित कोड ड्रॉपडाउन सूची पर नाम प्रस्तुत हुई है, लेकिन जब मैं एक नाम का चयन करें, कॉम्बो के प्रदर्शित पाठ "[email protected]"toString() विधि

cboEmployees.setCellFactory(new Callback<ListView<Employee>, ListCell<Employee>>() 
    { 
     @Override 
     public ListCell<Employee> call(ListView<Employee> p) 
     { 
      return new ListCell<Employee>() 
      { 
       @Override 
       protected void updateItem(Employee item, boolean empty) { 
        super.updateItem(item, empty); 

        if (item != null) 
        { 
         setText(item.getName()); 
        } 
       } 
      }; 
     } 
    }); 

है इस तरह की स्ट्रिंग, पूर्ण POJO की पहचान होता है प्रदर्शित पाठ को पीओजेओ की toString() विधि को ओवरराइड किए बिना चयनित नाम को भी प्रस्तुत करने का कोई तरीका है?

उत्तर

19

अपने ComboBox पर setButtonCell को आमंत्रित करें, कर्मचारी नाम प्रदर्शित करने के लिए उपयुक्त ListCell प्रस्तुतकर्ता कार्यान्वयन प्रदान करें।

उदाहरण के लिए:

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.scene.layout.*; 
import javafx.stage.Stage; 
import javafx.util.Callback; 

public class BasicComboBoxSample extends Application { 
    public static void main(String[] args) { launch(args); } 

    @Override public void start(Stage stage) { 
     final Employee john = new Employee("John"); 
     final Employee jill = new Employee("Jill"); 
     final Employee jack = new Employee("Jack"); 

     final ComboBox<Employee> cboEmployees = new ComboBox(); 
     cboEmployees.setButtonCell(new EmployeeListCell()); 
     cboEmployees.setCellFactory(new Callback<ListView<Employee>, ListCell<Employee>>() { 
      @Override public ListCell<Employee> call(ListView<Employee> p) { 
       return new EmployeeListCell(); 
      } 
     }); 
     cboEmployees.getItems().addAll(john, jill, jack); 
     cboEmployees.setValue(jill); 

     final StackPane layout = new StackPane(); 
     layout.getChildren().add(cboEmployees); 
     layout.setStyle("-fx-background-color: cornsilk; -fx-padding: 15;"); 
     stage.setScene(new Scene(layout)); 
     stage.show(); 
    }  

    class Employee { 
     public Employee(String name) { this.name = name; } 
     private String name; 
     public String getName() { return name; } 
    } 

    class EmployeeListCell extends ListCell<Employee> { 
     @Override protected void updateItem(Employee item, boolean empty) { 
      super.updateItem(item, empty); 
      if (!empty && item != null) { 
       setText(item.getName()); 
      } else { 
       setText(null); 
      } 
     } 
    } 
} 

नमूना उत्पादन:

combobox custom button sample

+0

दोषरहित काम किया है, धन्यवाद। – etercap

+0

यह केवल तभी काम करता है जब कॉम्बोबॉक्स संपादन योग्य नहीं है - संपादन योग्य कॉम्बोबॉक्स के लिए टेक्स्टफील्ड (संपादक) निर्दिष्ट बटन सेल रेंडरर का पालन नहीं करता है - यह अभी भी .toString() का उपयोग करता है। क्या कोई जानता है कि इसे कैसे करना है? –

+0

गहने - आपने अपना दिन बनाया, कई बार, बहुत बहुत धन्यवाद! आकर्षक की तरह काम करता है :) – bully

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