2011-07-06 16 views
5

Có cách nào rõ ràng để thêm dấu phân cách vào danh sách các tùy chọn trong WDownDownChoice không? Trong trường hợp của tôi, tôi đang tạo vùng chọn với hai loại đối tượng miền từ nguồn dữ liệu của tôi. Tôi đoán tôi có thể đi và tự thêm một số loại đối tượng miền giả vào danh sách lựa chọn nhưng nó cảm thấy khá xấu xí.Dấu phân cách trong Wicket DropDownChoice

Ví dụ:

+---------+-+ 
| Apple |▼| 
| Orange +-+ 
| ------- | 
| Carrot | 
| Cucumber| 
+---------+ 

mã hiện tại (không có bất kỳ dấu phân cách) trông giống như sau:

EntityModel model = getModel(); 
List<? extends Produce> foods = foodService.getAllProduce(); 
// getAllProduce() returns first all fruits, then all vegetables 
add(new DropDownChoice<Produce>(
    "produceSelect", new PropertyModel<Produce>(model, "favProduce"), foods) 
); 

Trả lời

2
+0

tôi đã sử dụng đây là giải pháp, xem mô tả chi tiết bên dưới trong câu trả lời của tôi. – Janne

+1

Tôi rất muốn xem liên kết được cập nhật nếu có. Nếu không, tôi không chắc câu trả lời này vẫn hợp lệ và có lẽ nên bị xóa. – spaaarky21

+0

@ spaaarky21 có thể [this] (http://www.wicket-library.com/wicket-examples/compref/wicket/bookmarkable/org.apache.wicket.examples.compref.SelectPage)? – aditsu

5
add(new DropDownChoice<String>("choice", Arrays.asList("Apple","Orange","Carrot","Cucumber")) { 
     @Override 
     protected void appendOptionHtml(AppendingStringBuffer buffer, String choice, int index, String selected) { 
      super.appendOptionHtml(buffer, choice, index, selected); 
      if ("Orange".equals(choice)) { 
       buffer.append("<optgroup label='----------'></optgroup>"); 
      } 
     } 
    }); 
+0

Thing là, PropertyModel được sử dụng vì một lý do chính đáng (thay đổi giao diện người dùng tốt đẹp và tự động xuống lớp kiên trì). Cách tiếp cận này (cho DropDownChoice đơn giản là một danh sách các lựa chọn) sẽ làm phức tạp các đối tượng miền (và cơ sở dữ liệu) được cập nhật như thế nào. – Jonik

+0

Er, cái gì? Ví dụ là về cách thêm dấu tách (ghi đè 'appendOptionHtml()' và chắp thêm ''). Việc chuyển danh sách trực tiếp chỉ là điều đơn giản nhất tôi có thể làm để làm ví dụ để biên dịch và chạy. Tất nhiên bạn có thể sử dụng 'PropertyModel' và các lớp tùy chỉnh ... – tetsuo

+0

Ah, xin lỗi, tôi bằng cách nào đó đã bỏ lỡ điểm của bạn (ghi đè appendOptionHtml()). Điều này thực sự sẽ làm việc với PropertyModel. Bạn chỉ cần tìm ra đối tượng miền * * cuối cùng của loại * đầu tiên * (hoặc đầu tiên của loại thứ hai, mà tôi đoán sẽ dễ dàng hơn). Vì vậy, 1 vì đây là một giải pháp khả thi, ít nhất là nhanh hơn việc chuyển sang Select & SelectOptions từ phần mở rộng wicket. – Jonik

7

tôi đã kết thúc giải quyết này bằng cách sử dụng các thành phần SelectSelectOptions từ wicket-extensions như đã đề cập bởi martin-g.

SelectOptions<Produce> fruitOptions = new SelectOptions<Produce>(
             "fruits", 
             fruitCollection, 
             new FruitRenderer()); 

SelectOptions<Produce> vegetableOptions = new SelectOptions<Produce>(
              "vegetables", 
              vegetableCollection, 
              new VegetableRenderer()); 

Select select = new Select("produceSelect", 
          new PropertyModel<Produce>(model, "favProduce")); 
select.add(fruitOptions); 
select.add(vegetableOptions); 

HTML tương ứng trông giống như sau:

<select wicket:id="produceSelect" id="produceSelect"> 
    <optgroup label="Fruits"> 
     <wicket:container wicket:id="fruits"> 
      <option wicket:id="option">Apple</option> 
     </wicket:container> 
    </optgroup> 
    <optgroup label="Vegetables"> 
     <wicket:container wicket:id="vegetables"> 
      <option wicket:id="option">Carrot</option> 
     </wicket:container> 
    </optgroup> 
</select> 

này tạo ra kết quả cuối cùng là một chút khác nhau nhưng tốt hơn là optgroup nhãn được in đậm và không thể được chọn:

+----------------+-+ 
| **Fruits**  |▼| 
| Apple   +-+ 
| Orange   | 
| **Vegetables** | 
| Carrot   | 
| Cucumber  | 
+----------------+ 
+2

Giải pháp này giả định rằng bạn biết rằng các nhóm sẽ là 'trái cây' và 'Rau'. Nếu bạn không biết các nhóm dự kiến ​​thì sao? – joshua

+0

Trong trường hợp đó, bạn sẽ không thể sử dụng một SelectOption theo cách này vì dưới mui xe nó chỉ là một repeatingListView mà cần phải có một ID. Bạn có thể muốn tạo một listviewe lặp lại trực tiếp dưới lựa chọn mà lần lượt chứa một SelectOption với một ID cố định? –

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