2010-04-22 28 views
6

Tôi cần đặt kích thước của absolutePanel về kích thước con, nhưng phương thức getOffset * trả về 0 vì (tôi nghĩ) con chưa được hiển thị.GWT - Lấy kích thước của một tiện ích không được hiển thị

Một ví dụ nhanh:

AbsolutePanel aPanel = new AbsolutePanel(); 
HTML text = new HTML(/*variable lenght text*/); 
int xPosition = 20; // actually variable 
aPanel.add(text, xPosition, 0); 
aPanel.setSize(xPosition + text .getOffsetWidth() + "px", "50px"); // 20px 50px 

tôi cũng có thể giải quyết vấn đề của tôi bằng cách sử dụng kích thước AbsolutePanel để thiết lập vị trí trẻ em và kích thước:

AbsolutePanel aPanel = new AbsolutePanel(); 
aPanel.setSize("100%", "50px"); 
HTML text = new HTML(/*variable lenght text*/); 
int xPosition = aPanel.getOffsetWidth()/3; // Once again, getOffsetWidth() returns 0; 
aPanel.add(text, xPosition, 0); 

Trong cả hai trường hợp, tôi phải tìm một một trong hai cách:

  • truy xuất kích thước của tiện ích con chưa được hiển thị
  • được thông báo khi tiện ích được hiển thị

Trả lời

2

Tôi nghĩ bạn nên cố gắng giải quyết vấn đề này bằng các kiểu css. Nếu tôi là bạn, tôi sẽ cố gắng thiết lập một phong cách cho cha mẹ và/hoặc bảng điều khiển tuyệt đối, sử dụng addStyle hoặc addStyleNames. Có thể một cái gì đó như ...

AbsolutePanel aPanel = new AbsolutePanel(); 
aPanel.setSize("100%", "50px"); 
HTML text = new HTML(/*variable lenght text*/); 
text.addStyleName("my-custom-style"); 

trong css bạn sẽ tạo kiểu css sau đó sẽ kích thước tiện ích của bạn một cách thích hợp.

Cách tiếp cận khác sẽ là ....

Bạn có thể tạo một hàm tạo một widget HTML kích thước chính xác mà bạn cần.

Dưới đây là một số mã cho bạn, để giúp bạn bắt đầu:

public native void customizeHTMLElement(Element elem, String widthInPx) /*-{ 
    elem.style.width = widthInPx; //this is basically pure js. 
}-*/ 

Then somewhere within your widget make a call to the above function like 

public void foo() { 
    ... 
    customizeHTMLElement(someElement, "20"); 
    ... 
} 

Một số thông tin về JSNI - http://code.google.com/webtoolkit/doc/latest/DevGuideCodingBasicsJSNI.html

+0

Thực tế có một số tiện ích trong AbsolutePanel của tôi với kích thước và vị trí cụ thể. Vì kích thước và vị trí không cố định (phụ thuộc dữ liệu) Tôi không thể sử dụng css ... – Garagos

+0

Bạn có thể mô tả loại vật dụng nào được sử dụng không - về cơ bản cung cấp thêm chi tiết về vấn đề bạn đang gặp phải với một số giải pháp khác. Những gì tôi đang nghĩ đến tại thời điểm này là phương pháp js bản địa, mà tôi rất tự tin sẽ làm việc - nhưng tôi nghĩ rằng nó sẽ là tốt hơn nếu bạn bằng cách nào đó quản lý để sử dụng ra phong cách css. – markovuksanovic

+0

Tôi cần tạo tiện ích đại diện cho các sự kiện kịp thời. Vì vậy, tôi đang sử dụng một tiện ích HTML để đại diện cho mỗi lần xuất hiện của các sự kiện đó (cũng có thể là một HorizontalPanel chứa một bộ mô tả) với vị trí = startDate và width = Thời lượng của sự kiện. Vì phương thức AbsolutePanel.add() chỉ lấy int cho vị trí pixel, tôi không thể làm việc với phần trăm. Vì vậy, tôi cần kích thước tham chiếu bằng pixel, hoặc từ AbsolutePanel hoặc một trong các lần xuất hiện. – Garagos

4

Widget có một phương pháp onLoad(), bạn có thể ghi đè sẽ kích hoạt khi các phụ tùng được gắn liền với DOM, tại thời điểm đó getOffsetWidth() sau đó sẽ trả lại kích thước văn bản được hiển thị - trừ khi tiện ích chuỗi của bạn đã có sẵn một số kích thước. Nếu bạn có thể làm những gì bạn cần với CSS (bao gồm có thể chỉ cần thiết lập "overflow: visible;") có lẽ tốt hơn, nhưng đôi khi bạn thực sự cần kích thước và kỹ thuật này sẽ cung cấp cho bạn.

1

Bạn chỉ nên gọi getOffsetHeight() sau khi tiện ích con được đặt và tính toán. Vì vậy, GWT có

com.google.gwt.core.client.Scheduler 

lớp học để thực hiện việc này.

Trong dự án của tôi, tôi sử dụng LayoutPanel để hiển thị trình đơn ở đầu và nội dung khác ở giữa. Nhưng tôi không biết kích thước của menu. Vì vậy, tôi cung cấp thông tin cho LayoutPanel được tính bằng cách sử dụng getOffsetHeight như sau:

layoutPanel.add(widget); 
Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() 
{ 
    public void execute() 
    { 
     int offsetHeight = widget.getOffsetHeight(); 
     layoutPanel.setWidgetTopHeight(widget, 0, Style.Unit.PX, offsetHeight, Style.Unit.PX); 
    } 
}); 
Các vấn đề liên quan