2009-12-21 22 views
16

Tôi đang cố gắng để có được một bố trí đơn giản làm việc theo GWT 2.0 bằng cách sử dụng UiBinder. Bố cục mà tôi đang cố gắng bắt đầu là bố cục bắt chước BorderLayout của Java ở nơi bạn có thể chỉ định các bảng khác nhau ở hướng bắc, nam, đông, tây và trung tâm; cho rằng tôi đang sử dụng DockLayoutPanel. Tôi muốn có được đầu trang và chân trang, cả hai đều có chiều rộng cố định. Không gian khung nhìn còn lại sẽ bị chiếm bởi tiện ích được gán cho vị trí trung tâm DockLayoutPanel.Cách bố trí các tiện ích con bằng cách sử dụng DockLayoutPanel và UiBinder trong GWT 2.0?

File .ui.xml hiện tại tôi nhận được là:

<g:DockLayoutPanel unit='EM'> 
    <g:north size='2'> 
     <g:HTML>HEADER</g:HTML> 
    </g:north> 

    <g:south size='2'> 
     <g:HTML>FOOTER</g:HTML> 
    </g:south> 

    <g:center> 
     <g:HTML> 
      <div id='loginform'>Hello!</div> 
     </g:HTML> 
    </g:center> 
</g:DockLayoutPanel> 

Trình duyệt chỉ làm cho HEADER ở góc trên cùng bên trái. Làm cách nào tôi có thể đạt được bố cục mà tôi đang tìm kiếm? Dường như có nhiều CSS bạn phải biết trước khi bạn có thể sử dụng bảng bố cục GWT, nhưng loại đó đánh bại mục đích tạo giao diện người dùng với nó.

Trả lời

29

Điều này làm việc cho tôi mà không có hack được gợi ý bởi RaphaelO.

Ví dụ Javadoc trên DockLayoutPanel sử dụng 192 làm chiều rộng cho phương Tây. Điều này là sai - tác giả có thể nghĩ rằng anh ta đang sử dụng PX, nhưng anh ta đang sử dụng EM. Vì vậy, nếu bạn thu nhỏ, bạn sẽ thấy rằng Trung tâm nằm ở bên phải.

Bạn đã kiểm tra chế độ tiêu chuẩn của mình chưa? Điều này là bắt buộc đối với DockLayoutPanel.

Ngoài ra, quên đề cập rằng bạn nên sử dụng RootLayoutPanel khi bạn thêm DockLayout vào lớp nhập cảnh của bạn - không sử dụng RootPanel.

+8

Tôi không biết về sự tồn tại của RootLayoutPanel.Một khi tôi thay đổi để sử dụng nó thay vì RootPanel, mọi thứ hoạt động như mong đợi. – Cesar

+0

Bạn có gặp phải bất kỳ lỗi nào trong bảng điều khiển không? Bạn có thể thử bằng cách sử dụng ví dụ javadocs (với chỉnh sửa của tôi để chiều rộng Tây) để xem nếu nó hoạt động? –

+3

Nó hiện đang hoạt động. Không có lỗi console. Vấn đề là tôi đã sử dụng RootPanel thay vì RootLayoutPanel. – Cesar

0

Tôi đã thử khối mã của bạn cũng như khối mẫu trên trang javadoc cho DockLayoutPanel và tôi nhận được kết quả tương tự. Chỉ dữ liệu trong phần Bắc của DockLayoutPanel mới được hiển thị. Tuy nhiên khi tôi tìm kiếm trang (sử dụng firefox và safari trên máy Mac), các phần tử khác được tìm thấy nhưng chúng không hiển thị ở bất kỳ đâu. Có vẻ như có lỗi với bảng điều khiển này và UiBinder.

+0

Cảm ơn bạn đã dùng thử. Nếu bạn kiểm tra mã được gửi tới máy khách, bạn có thể thấy các phần tử khác có ở đó. Tôi tin rằng đó là bố cục CSS không đúng, nhưng tôi không biết đủ CSS để gỡ lỗi nó. – Cesar

+0

Tôi đồng ý rằng nó là probablly một lỗi CSS nhưng nhìn thấy như thế nào cả hai chúng tôi thực sự đã làm bất cứ điều gì với CSS (Tôi chỉ sử dụng các mặc định) có vẻ như đây là một lỗi GWT. Bạn có thể muốn mở một lỗi trên trang web vấn đề GWT của mình (http://code.google.com/p/google-web-toolkit/issues/list) – Carnell

+0

Xem câu trả lời của @ RaphaelO: thực hiện Window.setMargin ("0"); trước khi thêm thể hiện của DockLayoutPanel vào RootLayoutPanel, có vẻ như làm điều này. –

2

Việc sử dụng Bảng bố cục mới được giới thiệu thực sự khá khó hiểu. Có một cách để làm cho bố trí chiếm toàn bộ khu vực khách hàng. Nó yêu cầu một chút mã Java ngoài tệp ui.xml.

Trong lớp EntryPoint của bạn, thêm một định nghĩa UiBinder với một chú thích vào file ui.xml mà tuyên bố bố trí:

@UiTemplate("LayoutDeclarationFile.ui.xml") 
interface DockLayoutUiBinder extends 
     UiBinder<DockLayoutPanel, TheEntryPointChildClass> { 
} 

private static DockLayoutUiBinder uiBinder = GWT 
     .create(DockLayoutUiBinder.class); 

trong hàm onModuleLoad, nhanh chóng UiBinder, lấy rễ của nó và trực tiếp thêm nó với DOM:

public void onModuleLoad() { 
    DockLayoutPanel layout = uiBinder.createAndBindUi(this); 
    // Make sure we use the whole client area 
    Window.setMargin("0px"); 

    // Add the panel to the DOM 
    RootLayoutPanel.get().add(layout); 
} 
+0

Điều này đã giúp ích trong trường hợp của tôi, mặc dù tôi phải thực hiện một số điều chỉnh đối với trường hợp cụ thể của mình, vì tôi đang sử dụng một lớp riêng biệt cho thành phần giao diện người dùng của mình. "interface DockLayoutUiBinder mở rộng {}" <- Using "DockLayoutPanel" ở đây là phần thực sự quan trọng giúp trong trường hợp của tôi. – WhyNotHugo

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