2013-10-08 3 views
8

मैं प्रकार Person के ComboBox<Perosn>, जिसमें मैं Person वर्ग की कुछ वस्तु को शामिल किया है है,JavaFX संपादन योग्य ComboBox: आइटम चयन पर दिखा toString

मैं setCellFactory(Callback) विधि ड्रॉप डाउन

ComboBox में व्यक्ति के नाम को दिखाने के लिए इस्तेमाल किया है
combobox.setCellFactory(
    new Callback<ListView<Person >, ListCell<Person >>() { 
     @Override 
     public ListCell<Person > call(ListView<Person > p) { 
      ListCell cell = new ListCell<Person >() { 
       @Override 
       protected void updateItem(Person item, boolean empty) { 
        super.updateItem(item, empty); 
        if (empty) { 
         setText(""); 
        } else { 
         setText(item.getName()); 
        } 
       } 
      }; 
      return cell; 
     } 
    }); 

और setButtonCell(ListCell) चयन पर combobox में नाम दिखाने के लिए विधि।

combobox.setButtonCell(
    new ListCell<Object>() { 
     @Override 
     protected void updateItem(Person t, boolean bln) { 
      super.updateItem(t, bln); 
      if (bln) { 
       setText(""); 
      } else { 
       setText(t.getName()); 
      } 
     } 
    }); 

यह सामान्य मामले के साथ पूरी तरह से काम करता है अच्छा लेकिन जब मैं संपादन योग्य बता गया का उपयोग तो यह विफल रहता है।

जब मैं लिखता हूं, combobox.setEditable(true); फिर आइटम चयन पर कंबोबॉक्स का टेक्स्ट फ़ील्ड (संपादक) toString() व्यक्ति वर्ग की विधि दिखाता है।

सामान्य मामला: Normal Case

संपादन योग्य मामला: Editable Case

वहाँ इस के लिए किसी भी समाधान है ??

मैं एक मॉडल वर्ग है,

public class Person { 
    String name; 
    int age; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public int getAge() { 
     return age; 
    } 

    public void setAge(int age) { 
     this.age = age; 
    } 

    @Override 
    public String toString() { 
     return "Person{" + "name=" + name + ", age=" + age + '}'; 
    } 
} 

उत्तर

11

यहां मेरे अपने प्रश्न का उत्तर दिया गया है जो मैंने कई प्रयासों और सुधारों के बाद सबसे अच्छा पाया।

mainComboBox.setButtonCell(
    new ListCell<Object>() { 
     @Override 
     protected void updateItem(Object t, boolean bln) { 
      super.updateItem(t, bln); 
      if (bln) { 
       setText(""); 
      } else { 
       setText(getStringField(t)); 
      } 
     } 
    }); 

mainComboBox.setConverter(
    new StringConverter() { 
     private Map<String, Object> map = new HashMap<>(); 

     @Override 
     public String toString(Object t) { 
      if (t != null) { 
       String str = getStringField(t); 
       map.put(str, t); 
       return str; 
      } else { 
       return ""; 
      } 
     } 

     @Override 
     public Object fromString(String string) { 
      if (validate && !map.containsKey(string)) { 
       mainComboBox.setValue(null); 
       mainComboBox.getEditor().clear(); 
       return null; 
      } 
      return map.get(string); 
     } 
    }); 

mainComboBox.setCellFactory(
    new Callback<ListView<Object>, ListCell<Object>>() { 
     @Override 
     public ListCell<Object> call(ListView<Object> p) { 
      ListCell cell = new ListCell<Object>() { 
       @Override 
       protected void updateItem(Object item, boolean empty) { 
        super.updateItem(item, empty); 
        if (empty) { 
         setText(""); 
        } else { 
         setText(getStringField(item)); 
        } 
       } 
      };return cell; 
     } 
    }); 

और getStringField(Object) के लिए आवश्यक कार्य के साथ,

public String getStringField(Object o) { 
    return ((Pesron) o).getName(); 
} 
+1

तुम मेरे जवाब यह है कि सही समाधान देता है और 1 घंटे तैनात किया गया था अपने प्रश्न प्रस्तुत की गई थी के बाद को देखा है? – Sebastian

15

आप उस उद्देश्य के लिए ComboBox पर एक StringConverter स्थापित करने के लिए (वहाँ कोई दूसरा रास्ता नहीं है, ComboBox के स्रोत कोड देख)

यहाँ है जरूरत एक उदाहरण:

import javafx.application.Application; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.ComboBox; 
import javafx.stage.Stage; 
import javafx.util.StringConverter; 

import java.util.Arrays; 
import java.util.List; 

public class ComboBoxTest extends Application { 
    private ComboBox<Integer> cmb_year = new ComboBox<>(); 

    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     Group root = new Group(); 
     root.getChildren().add(cmb_year); 
     cmb_year.setPrefWidth(150); 
     Scene scene = new Scene(root, 500, 500); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 

     List<Integer> ints = Arrays.asList(2012, 2013, 2014, 2015); 
     cmb_year.getItems().addAll(ints); 

     cmb_year.setConverter(
      new StringConverter<Integer>() { 
       @Override 
       public String toString(Integer integer) { 
        if (integer == null) { 
         return ""; 
        } else { 
         return "that's a year: " + integer.intValue(); 
        } 
       } 

       @Override 
       public Integer fromString(String s) { 
        try { 
         return Integer.parseInt(s); 
        } catch (NumberFormatException e) { 
         return null; 
        } 
       } 
      }); 

     cmb_year.setPromptText("select year"); 
     cmb_year.setEditable(true); 

     Button distraction = new Button("distraction"); 
     distraction.setLayoutX(100); 
     distraction.setLayoutY(100); 
     root.getChildren().add(distraction); 
    } 
} 

परिणाम:

enter image description here enter image description here

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