Diễn đàn www.javavietnam.org 8h:00 AM - 07/01/2009
Tìm kiếm nâng cao
Thời khóa biểu mới của trường           Vi phạm bản quyền phần mềm có thể bị xử lý hình sự           Google suy nghĩ về động thái mới của Microsoft           Google đoạt ngôi website No 1 tại Mỹ           Quảng cáo tương tác là ‘mỏ vàng’ cho mạng xã hội VN           Bài 14: Lập trình giao diện cấp cao với lớp List (phần 3)           Bài 13: Lập trình giao diện cấp cao với lớp List (phần 2)           Bài 12: Lập trình giao diện cấp cao với lớp List           Bài 11: Lập trình giao diện cấp cao với lớp Alert (phần 2)           Bài 10: Lập trình giao diện cấp cao với lớp Alert           Hồ sơ
Developer of the Year   
SWT – Layout
20:02:34 26-10-2007

FormLayout

Phải nói đây là một Layout mà để sử dụng được một cách hiệu quả thì bạn cũng phải bỏ ra một ít thời gian để tìm hiểu. Nhưng bù lại bạn sẽ có một trình quản lý bố cục thực sự hiệu quả, nó đủ cho bạn hình thành và phát triển những bố cục giao diện theo ý muốn của mình.

SWT cung cấp cho chúng ta các lớp liên quan tới trình bố cục này, đó là lớp FormLayout, FormData và FormAttachment.

Bản thân lớp FormLayout chỉ có nhiệm vụ khai báo cách quản lý bố cục, nó chỉ có các trường đơn giản về việc cân lề của các thành phần con mà thôi. Và các trường cân lề này mang ý nghĩa tương tự như các trường cân lề đã trình bày ở GridLayout, các bạn có thể xem lại phần trình bày về GridLayout ở trên để hiểu về các trường này. Chúng ta sẽ đi thẳng vào việc tìm hiểu về FormData và FormAttachment, những đối tượng làm nên một trình bố cục FormLayout mềm dẻo, linh động và thực sự hiệu quả.

FormData và FormAttachment

1. FormData Object Fields

Đối tượng FormData chỉ rõ mỗi widget ở trong FormLayout sẽ được trình bày như thế nào. Mỗi đối tượng FormData định nghĩa sự gắn kết bốn cạnh của mỗi widget. Sự gắn kết muốn nói tới vị trí các cạnh của mỗi widget. Để thiết lập đối tượng FormData, bạn sử dụng phương thức setLayoutData, ví dụ:

Button B1 = new Button (shell, SWT.PUSH);

B1.setText(“B1”);

B1.setLayoutData(new FormData());

Trong trường hợp này sự gắn kết mặc định được định nghĩa, điều này làm mất đi toàn bộ mục đích và tính hữu dụng của FormLayout. Sự gắn kết mặc định đính (attach) một widget vào vị trí cạnh trên (top) và cạnh trái (left) của parent Composite. Nếu tất cả widget trong FormLayout sử dụng sự gắn kết mặc định thì chúng sẽ nằm chồng lên nhau ở góc phía trên bên trái của parent Composite. Điều đó tôi chưa thấy nó dùng trong trường hợp nào là hiệu quả, và tôi khuyên bạn không nên dùng cách này, nó không có ý nghĩa gì cả!

Các trường left, right, top và bottom của FormData theo thứ tự lần lượt chỉ định rõ các đối tượng FormAttachment được kết hợp với cạnh trái, phải ,trên và dưới của mỗi widget. Ví dụ:

Code 6 FormData

FormLayout formLayout = new FormLayout();

shell.setLayout(formLayout);



Button b1 = new Button(shell,SWT.PUSH);

b1.setText("ITS");

FormData formData = new FormData();

formData.top = new FormAttachment(0,20);

formData.bottom = new FormAttachment(100,-5);

formData.left = new FormAttachment(20,0);

formData.right = new FormAttachment(100,-3);

b1.setLayoutData(formData);

Nếu bạn thấy tò mò với các tham số trong đối tượng FormAttachment thì cứ chỉnh sửa xem sao. Và tôi nghĩ làm vậy thì trước khi xem tiếp phần trình bày về FormAttachment dưới đây thì bạn cũng đã biết được đôi điều về nó.

Các trường width và height của FormData chỉ rõ yêu cầu về kích thước của chiều rộng và chiều cao của widget. Nếu như chiều rộng hoặc chiều cao được chỉ rõ xảy ra xung đột do sự ép buộc bởi sự gắn kết, thì chiều rộng hoặc chiều cao sẽ mất đi hiệu lực của nó. Nhưng trong một số trường hợp mà bạn không muốn định nghĩa sự gắn kết cho tất cả các cạnh của widget thì sự thiết lập được định đoạt bởi chiều cao và chiều rộng. Điều này phụ thuộc vào sự thiết kế giao diện của bạn. Sau đây là các ví dụ mà có thể chiều cao hoặc chiều rộng mất đi hiệu lực của nó khi thay đổi kích thước của shell.

Chiều cao vẫn đạt được hiệu lực như mong muốn:

FormData formData = new FormData();

formData.height = 100;

formData.top = new FormAttachment(0,5);

/*formData.bottom = new FormAttachment(100,-5);

Làm mất đi hiệu lực của height trong trường hợp này*/

formData.left = new FormAttachment(0,5);

formData.right = new FormAttachment(100,-5);

b1.setLayoutData(formData);

Chiều rộng vẫn đạt được hiệu lực như mong muốn:

FormData formData = new FormData();

formData.width = 50;

formData.top = new FormAttachment(0,5);

formData.bottom = new FormAttachment(100,-5);

formData.left = new FormAttachment(0,5);

/*formData.right = new FormAttachment(100,-5);

Làm mất đi hiệu lực của width trong trường hợp này*/

b1.setLayoutData(formData);

 

2. FormAttachment Objects

Các phương thức khởi tạo của FormAttachment:

  • FormAttachment(Control control)

  • FormAttachment(Control control, int offset) (*)

  • FormAttachment(Control control, int offset, int alignment)

  • FormAttachment(int numerator, int offset) (*)

  • FormAttachment(int numerator, int denominator, int offset)

* : thường được sử dụng, trong đó: control: chỉ định widget được lấy làm mốc; offset: chỉ định khoảng trống được tính theo các pixels; numerator: chỉ ra độ co giãn tương đối theo một tỉ lệ với denominator.

Code7 FormAttachment

FormLayout formLayout = new FormLayout();

shell.setLayout(formLayout);



Button b1 = new Button(shell,SWT.PUSH);

b1.setText("ITS");

Button b2 = new Button(shell,SWT.PUSH);

b2.setText("Love JavaVietnam.org");

Button b3 = new Button(shell,SWT.PUSH);

b3.setText("Learning and Sharing");



FormData formData = new FormData();

formData.width = 50;

formData.top = new FormAttachment(0,15);

formData.bottom = new FormAttachment(100,-15);

formData.left = new FormAttachment(0,15);

b1.setLayoutData(formData);



FormData formData1 = new FormData();

formData1.height = 50;

formData1.left = new FormAttachment(b1,25);

formData1.top = new FormAttachment(0,15);

formData1.right = new FormAttachment(100,-20);

b2.setLayoutData(formData1);



FormData formData2 = new FormData();

formData2.left = new FormAttachment(b1,15);

formData2.top = new FormAttachment(b2,20);

formData2.right = new FormAttachment(100,-15);

formData2.bottom = new FormAttachment(100,-25);

b3.setLayoutData(formData2);

FormAttachment là một đối tượng định nghĩa sự gắn kết riêng biệt các cạnh của widget. Nó không cần phải thiết lập sự gắn kết cho tất cả bốn cạnh của widget. Việc giải thích ý nghĩa của các trường của FormAttachment được minh họa theo hình vẽ dưới đây, là kết quả cài đặt của code 7.

 

Toàn bộ bài viết về Layouts trong SWT được tổng hợp lại. Gồm có FillLayout, RowLayout, GridLayout và FormLayout (đây là những trình bố cục cơ bản,còn những trình bố cục khác như StackLayout hay BorderLayout... mình không trình bày ở đây, vì mình hầu như không dùng đến, dùng các Layouts cơ bản là cũng đủ rồi.À mà null layout thì chắc là khỏi phải nói nhỉ). Để edit bài viết trực tiếp lên đây mình gặp một số khó khăn trong việc trình bày (format) nên các bạn có thể down file "LayoutsInSWT.rar", giải nén sẽ có được file "LayoutsInSWT.pfd". Rất mong nhận được ý kiến đóng góp của các bạn.

 

Minh họa : LayoutsInSWT.rar

(http://www.javavietnam.org/javavn/mvnforum/getattachment?attach=1370)



Tác giả : ITS

JavaVietnam.org



 
In Gửi Phản hồi
Tin đã đưa   
JTabbedPane với CloseButton [X]      (26/10/2007)

     
Google
www.javavietnam.org Top