2009-10-06 19 views
6

Tôi đang cố gắng để tạo ra một khung tiêu đề biên giới trong GWT, mà kết quả trong việc này:bảng khung Với tiêu đề cho GWT (sử dụng fieldset và LEGEND html tags)

Legend+Fieldset

Điều này có thể được thực hiện bằng HTML fieldset và các thẻ chú giải, chẳng hạn như

<fieldset> 
    <legend>Connection parameters</legend> 
    ... the rest ... 
</fieldset> 

Tôi muốn tạo tiện ích tùy chỉnh trong GWT thực hiện điều đó. Tôi quản lý để làm điều đó, nhưng vấn đề là các sự kiện xảy ra bên trong các widget (nút bấm vv) không bị sa thải mặc dù tôi đã thêm xử lý.

thực hiện của tôi về widget như sau:

public class TitledPanel extends Widget { 
private Element legend; 
private Widget content = null; 

public TitledPanel() { 
    Element fieldset = DOM.createFieldSet(); 
    legend = DOM.createLegend(); 
    DOM.appendChild(fieldset, legend); 
    setElement(fieldset); 
} 

public TitledPanel(String title) { 
    this(); 
    setTitle(title); 
} 

@Override 
public String getTitle() { 
    return DOM.getInnerHTML(legend); 
} 

@Override 
public void setTitle(String html) { 
    DOM.setInnerHTML(legend, html); 
} 

public Widget getContent() { 
    return content; 
} 

public void setContent(Widget content) { 
    if (this.content != null) { 
     DOM.removeChild(getElement(), this.content.getElement()); 
    } 

    this.content = content; 

    DOM.appendChild(getElement(), content.getElement()); 
} 
} 

Tôi có cần phải mở rộng Composite, hoặc cần phải tự định tuyến lại các sự kiện, hoặc là có cách nào khác?

Trả lời

17

Tôi nghĩ rằng bạn đang tìm kiếm CaptionPanel:

Một bảng điều khiển mà kết thúc tốt đẹp nội dung của nó trong một biên giới với một chú thích xuất hiện ở góc trên bên trái của biên giới. Đây là một cài đặt của phần tử HTML fieldset.

1

Tôi nghĩ vấn đề ở đây là bạn chỉ cần gọi DOM.appendChild - điều này không gây ra TitledPanel để thông qua Widget. Các hành động bình thường là bạn mở rộng Composite và sau đó gọi initWidget(Widget widget) - bên trong mui xe nó gọi widget.setParent(this);, do đó làm cho phụ huynh chấp nhận tiện ích này và đính kèm nó vào tài liệu của trình duyệt. Tuy nhiên, com.google.gwt.user.client.ui.Widget.setParent (Widget) chỉ hiển thị gói để bạn không thể gọi nó từ mã của bạn (sau, ví dụ: DOM.appendChild).

Tôi khuyên bạn nên đọc Widget Best Practices/Widget Building, đặc biệt là Dọn dẹp sau khi bạn và/hoặc xem mã nguồn cho một số Widget GWT, để biết ý tưởng cách GWT thấy tạo tiện ích tùy chỉnh.

Và, như Robert suggested, CaptionPanel là tuyến đường an toàn hơn :)