2010-02-03 26 views
17

Hi Tôi đang sử dụng một BoxLayout để ngăn xếp JPanel s trên đầu trang của mỗi khác (BoxLayout.Y_AXIS), ví dụ nếu mẹ tôi JPanel có chiều cao 500 pixel và tôi thêm hai tấm pin con với nó cả hai chiều cao 100 pixel. Các BoxLayout kéo dài chúng để họ cùng nhau chiếm không gian 500px. Có ai biết cách tắt tính năng này không?BoxLayout trải dài thành phần để phù hợp với bảng điều khiển cha mẹ

+0

How are you sepcifying kích thước của tấm đứa trẻ? – Ascalonian

+0

Với panel.setPrefferedSize và panel.setMinimumSize cả hai bằng cách sử dụng cùng một Dimension – Aly

Trả lời

10

Sử dụng GridBagLayout để thay thế. Bạn có quyền kiểm soát nhiều hơn đối với giao diện người dùng của mình.

Nhưng nếu bạn muốn sử dụng BoxLayout vẫn còn, và không muốn chúng căng ra, bạn có thể kiểm tra bằng cách sử dụng invisible component fillers như khu vực cứng nhắc, keo và chất độn.

+3

Nếu bỏ phiếu bầu cho tôi, vui lòng cung cấp lý do – Ascalonian

+0

Hãy nhớ xem phần "Horizontal Glue" trong liên kết được đăng. Rất hữu ích. – FuriousFolder

3

Bảng của bạn đang kéo dài vì BoxLayout không hạn chế từng bảng theo kích thước ưa thích của nó. Bạn cần phải tìm các bố trí mà tôn trọng kích thước ưa thích của một thành phần, như các vị trí NORTH và SOUTH của BorderLayout.

Hãy thử điều này:

  1. Tạo một JPanel với một BorderLayout. Thêm thành phần con của bạn là NORTH trong JPanel này.
  2. Tạo một JPanel thứ hai cho thành phần con khác, thêm nó làm NORTH của BorderLayout
  3. Thêm hai JPanels vào BoxLayout của bạn.

Code:

JPanel panel1 = new JPanel(new BorderLayout()); 
panel1.add(component1, BorderLayout.NORTH); 
JPanel panel2 = new JPanel(new BorderLayout()); 
panel2.add(component2, BorderLayout.NORTH); 

JPanel boxPanel = new JPanel(); 
BoxLayout boxLayout = new BoxLayout(boxPanel, BoxLayout.Y_AXIS); 
boxPanel.setLayout(boxLayout); 
boxPanel.add(panel1); 
boxPanel.add(panel2); 
+1

Tôi thích giải pháp này bởi vì nó tránh rối tung với gridbag và sửa đổi các thành phần bản thân cả hai đều là một lợi thế lớn. –

1

Bí quyết là, như các câu trả lời trước đã đề cập, sử dụng keo, chất độn, và các khu vực cứng nhắc trong cách bố trí hộp. Tuy nhiên, không giống như responder đó, tôi khuyên bạn nên gắn bó với BoxLayout - bạn có thể thực hiện hầu hết các giao diện người dùng đơn giản dễ dàng hơn với Box so với Grid Bag; và sức mạnh bổ sung không mua cho bạn nhiều trong hộp thoại điển hình của bạn.

Trong thành ngữ cũ, đây là những thứ như Box.createHorizontalStrut (int x) và Box.createHorizontalGlue(); ý tưởng là bạn đặt một thanh chống giữa các thành phần đầu tiên và thứ hai của bạn và sau đó thêm một keo sau khi thứ hai. ("strut" = "vùng cứng nhắc" ngày nay).

+0

Tôi sẽ đồng ý với điều đó cho mục đích xếp chồng chung, GridBagLayout có thể quá mức cần thiết. Chỉ cần gợi ý nếu anh ta tiến lên. – Ascalonian

+0

Tôi đã thử đặt một khu vực cứng nhắc giữa hai tấm con và keo thẳng đứng sau tấm thứ hai, đặt các tấm vẫn đang được kéo dài: s – Aly

+0

Không có điều gì như là quá mức cần thiết :) – willcodejavaforfood

20

BoxLayout là một trong số ít người quản lý bố cục tôn trọng kích thước tối thiểu và tối đa của một thành phần. Vì vậy, nếu bạn muốn ngăn không cho bảng kéo giãn, bạn có thể sử dụng:

panel.setMaximumSize(panel.getPreferredSize()); 
+0

Điều này có thể đã được một thời gian trước đây, nhưng là sử dụng một phương pháp getPreferredSize() ghi đè? – MikeM

+0

@MikeM, không, vì bảng điều khiển dựa vào trình quản lý bố cục để trả lại kích thước ưa thích. Trên thực tế, một giải pháp tốt hơn là mở rộng JPanel và ghi đè phương thức 'getMaximumSize()' để trả về giá trị từ phương thức 'getPreferredSize()'. Bằng cách này, kích thước tối đa sẽ được tính toán động trong trường hợp kích thước ưa thích tự động thay đổi. – camickr

+0

Thú vị, cảm ơn. – MikeM

2

Điều này có vẻ hoạt động hoàn toàn tốt ... bằng cách sử dụng BoxLayout, như bạn muốn.

test

this.setLayout(new FlowLayout()); // this being the JFrame 

    JPanel panel = new JPanel(); 
    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 
    panel.setPreferredSize(new Dimension(500, 500)); 
    panel.setBackground(Color.orange); 
    this.add(panel); // add the parent to the JFrame 

    JPanel pnlChild1 = new JPanel(); 
    pnlChild1.setBackground(Color.cyan); 
    pnlChild1.setMaximumSize(new Dimension(200, 100)); 

    JPanel pnlChild2 = new JPanel(); 
    pnlChild2.setBackground(Color.magenta); 
    pnlChild2.setMaximumSize(new Dimension(200, 100)); 

    panel.add(pnlChild1); 
    panel.add(pnlChild2); 
Các vấn đề liên quan