2012-11-13 3 views
11

Ich habe eine Liste von Mitarbeitern, deren Namen ich in einem Kombinationsfeld rendern muss, damit der Benutzer auswählen kann. Der folgende Code macht die Namen auf der Dropdown-Liste, aber wenn ich einen Namen auswählen, enthält die Combo angezeigten Text die volle POJO Identität, eine Zeichenfolge wie „[email protected]Rendern eines POJO mit dem Kombinationsfeld von JavaFX 2 ohne die toString() -Methode zu überschreiben

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

Ist Gibt es eine Möglichkeit, dass der angezeigte Text auch den ausgewählten Namen rendert, ohne die toString() - Methode des POJO zu überschreiben?

Antwort

19

Rufen Sie setButtonCell auf Ihrem ComboBox auf und stellen Sie eine entsprechende ListCell Renderer-Implementierung bereit, um den Namen des Mitarbeiters anzuzeigen.

Zum Beispiel:

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

Beispielausgabe:

combobox custom button sample

+0

einwandfrei funktioniert, danke. – etercap

+0

Dies scheint nur zu funktionieren, wenn die ComboBox nicht editierbar ist - für editierbare ComboBoxes folgt das Textfeld (Editor) nicht dem angegebenen Button Cell Renderer - es verwendet weiterhin .toString(). Weiß jemand, wie man das macht? –

+0

Juwel - du hast meinen Tag, wie oft, vielen Dank! Funktioniert wie Charme :) – bully

Verwandte Themen