2012-11-13 51 views
11

我有一個僱員的名單,我需要在組合框上呈現給用戶選擇的名稱。下面的代碼將呈現下拉名單上的名字,但是當我選擇一個名字,組合的顯示的文本包含了完整的POJO的身份,一個字符串,如「[email protected]用JavaFX 2的組合框呈現POJO而不覆蓋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

這似乎只適用於ComboBox不可編輯 - 對於可編輯的ComboBoxes,TextField(編輯器)不遵守指定的按鈕單元格渲染器 - 它仍然使用.toString()。有人知道怎麼做嗎? –

+0

寶石 - 你讓我的一天,無數次,非常感謝!作品像魅力:) – bully