2009-06-01 31 views
6

Trong GridBagLayout, thành phần nào là tốt nhất để cung cấp khoảng trống trong bảng điều khiển? Lý tưởng nhất là tôi muốn sử dụng một thành phần có:Thành phần đệm trọng lượng nhẹ nhất trong GridBagLayout

  1. thấp overhead
  2. Không tác dụng phụ khi không có không gian trống rỗng được yêu cầu (tức là không có kích thước tối thiểu)
  3. Một constructor tầm thường (không có tham số)

Một JPanel vi phạm số 2 ở trên. Một Box đòi hỏi một tham số constructor (# 3 ở trên), điều này thực sự không cần thiết trong trường hợp đơn giản này. Một JLabel hoạt động tốt nhưng tôi lo lắng rằng nó có thể có một số chi phí, mặc dù thừa nhận nó có lẽ là khá thấp.

Một lớp ẩn danh cũng có vẻ hoạt động tốt (nghĩa là "JComponent mới() {}"), nhưng điều đó bổ sung thêm tệp .class bổ sung mỗi lần tôi sử dụng. Tôi cho rằng nó không có chi phí cao hơn bất kỳ xử lý sự kiện được đưa ra mặc dù. Nó có đáng để tạo ra một thành phần tùy chỉnh, không thực hiện xuất phát từ JComponent cho điều này không? Có một thành phần hiện có mà tôi đang thiếu?

FYI GridBagLayout là một trong những ràng buộc của tôi đối với nhóm tôi là một phần của, do đó các bố cục khác không phải là một lựa chọn.

+0

Tôi cũng đã cố gắng một lớp vô danh có nguồn gốc từ Hợp phần (chứ không phải JComponent), và điều này dường như làm việc tốt quá. Tôi lo lắng một chút về một số vấn đề tương thích có thể với việc đặt một thành phần AWT trong một GUI Swing (thiếu đôi đệm ví dụ), nhưng nó chắc chắn có vẻ như nó sẽ là một giải pháp rất nhẹ cân. – dcstraw

+0

Thành phần phải ổn. Canvas sẽ không như nó sẽ tạo ra một peer nặng, mặc dù tôi tin rằng đã có một số cải tiến làm việc trong khu vực đó gần đây. –

Trả lời

10

Bạn đề cập đến Hộp nhưng nó có thể được sử dụng theo kiểu "nhẹ" với bốn phương pháp tĩnh sau đây chỉ đơn giản trả về một thành phần. Tôi sử dụng tất cả các thời gian. Chúng vô hình đối với bức tranh. Trong trường hợp của bạn có vẻ như keo là cách để đi. Một nhà xây dựng tầm thường (như đó là một điều xấu!), Chi phí thấp. Các tác dụng phụ khi không có không gian được yêu cầu là tất cả xuống đến cách bạn bố trí gridbag của bạn.

panel.add(Box.createHorizontalGlue()); 
panel.add(Box.createVerticalGlue()); 
panel.add(Box.createHorizontalStrut(int width)); 
panel.add(Box.createVerticalStrut(int width)); 

javadoc ở đây: http://java.sun.com/javase/6/docs/api/javax/swing/Box.html

+0

Tôi thích giải pháp này rất nhiều. Phương thức "createGlue()" cũng hoạt động tốt cho mục đích của tôi. Điều duy nhất của tôi với điều này là nó dành cho BoxLayouts, nhưng tôi sẽ cố gắng vượt qua nó và không quá cầu kỳ. :) Cảm ơn câu trả lời! – dcstraw

+0

Không cần thiết phải tuân thủ - từ JavaDoc: "Box cung cấp một số phương thức lớp hữu ích cho các thùng chứa bằng cách sử dụng BoxLayout - ngay cả các thùng chứa không phải Hộp". – banjollity

+0

Lưu ý, tài liệu được liên kết đề xuất chống lại việc sử dụng thanh chống, ủng hộ các khu vực cứng nhắc, với kích thước cố định. (Bên cạnh các vùng cứng nhắc, sử dụng keo cho miếng đệm có thể trồng được, và Box.Filler tùy chỉnh để kiểm soát các kích thước tối đa/phút/ưa thích.) –

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