2012-11-13 32 views
11

Tôi có danh sách nhân viên có tên tôi cần hiển thị trên hộp kết hợp để người dùng chọn. Các mã sau đây ám chỉ rằng tên trong danh sách thả xuống, nhưng khi tôi chọn một cái tên, văn bản hiển thị của kết hợp chứa danh tính đầy đủ các POJO, một chuỗi như "[email protected]"Hiển thị POJO với Hộp kết hợp JavaFX 2 mà không ghi đè phương thức 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()); 
        } 
       } 
      }; 
     } 
    }); 

Is có cách nào để làm cho văn bản được hiển thị cũng hiển thị tên đã chọn mà không ghi đè phương thức toString() của POJO không?

Trả lời

19

Gọi setButtonCell trên số ComboBox của bạn, cung cấp cách triển khai ListCell trình kết xuất phù hợp để hiển thị tên nhân viên.

Ví dụ:

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

Mẫu đầu ra:

combobox custom button sample

+0

Làm việc một cách hoàn hảo, cảm ơn. – etercap

+0

Điều này dường như chỉ hoạt động nếu ComboBox không thể chỉnh sửa - đối với ComboBox có thể chỉnh sửa, trường văn bản (trình chỉnh sửa) không tuân theo nút trình kết xuất ô được chỉ định - nó vẫn sử dụng .toString(). Bất cứ ai biết làm thế nào để làm điều này? –

+0

viên ngọc - bạn đã làm ngày của tôi, nhiều lần, cảm ơn rất nhiều! Hoạt động như charme :) – bully

Các vấn đề liên quan