2009-05-11 52 views
15

Có thể cho JPanel biết kích thước của nó để phù hợp với tất cả các thành phần chứa trong đó không? Một cái gì đó như pack() cho JFrame.Kích thước JPanel bởi các thành phần bên trong

chỉnh sửa: Bí quyết với ưu tiênSize không hữu ích. Tôi đã có JSplitPane, nơi trong một phần có GridBagLayout với nhiều nhãn (xem ảnh chụp màn hình) và các nhãn chồng lên nhau.

screenshot http://foto.darth.cz/pictures/screen.png

Trả lời

17

Sau khi xem xét các mã nguồn cho pack(), tôi đã đưa ra:

panel.setPreferredSize(panel.getPreferredSize()); 

Điều này buộc các bảng điều khiển để tính toán lại kích thước ưa thích của nó dựa trên các kích thước ưa thích của subcomponenents của nó.

Bạn có thể hoặc không phải gọi số validate() sau đó; trong ví dụ nhỏ bé của tôi, nó dường như không tạo ra sự khác biệt nào, nhưng Javadoc nói:

Phương pháp validate được sử dụng để làm cho thùng chứa nằm lại thành phần phụ của nó. Nó sẽ được gọi khi các thành phần của thùng chứa này được sửa đổi (thêm vào hoặc loại bỏ khỏi thùng chứa hoặc thông tin liên quan đến bố cục đã thay đổi) sau khi vùng chứa đã được hiển thị.

Vì vậy, tôi đoán điều đó phụ thuộc vào lý do bạn phải đóng lại số JPanel.

+0

Thanks.It'll là ok nếu bạn không setSize, phương thức setPreferredSize hoặc setMinimumSize. –

1

có lẽ bạn có thể làm một cái gì đó như thế bằng cách loại bỏ từ bảng điều khiển của bạn

setResizable (false);

3

Theo mặc định Container s có kích thước ưa thích phù hợp với kích thước bố cục ưa thích do vùng chứa cung cấp. Vì vậy, theo nghĩa đen, tất cả những gì bạn phải làm là:

panel.setSize(panel.getPreferredSize()); 

Có lẽ bạn đang làm điều gì đó kỳ lạ với cha mẹ để ngăn người quản lý bố trí làm việc tương đương với điều này.

1

tôi sẽ cố gắng:

panel.revalidate(); 
panel.repaint(); 

này sẽ không nhất thiết phải thiết lập các bảng điều khiển để kích thước ưa thích của mình, đó là phụ thuộc nhiều hơn vào những gì người quản lý bố trí quyết định sử dụng.

Điều này rất hữu ích trong trường hợp bạn đã thêm/xóa thành phần khỏi bảng điều khiển hiện được hiển thị và hiển thị.

Cập nhật: Dựa trên ảnh chụp màn hình của bạn Tôi có thể nói như sau: 1) Cân nhắc thay đổi vị trí bộ chia theo chương trình. 2) Cân nhắc lập trình thay đổi kích thước cửa sổ theo chiều ngang vì có vẻ hơi chặt chẽ để hiển thị cả hai mặt của ngăn chia tách. Hoặc cả hai. Bạn có thể thiết lập vị trí chia bằng cách làm

splitPane.setDividerLocation(newSize); 

Hãy ghi nhớ rằng có hai phương pháp quá tải cho điều này, một tham gia một phao một thực thi một int. Phao có tỷ lệ phần trăm của kích thước trong khi int là kích thước tính bằng pixel. Kích thước dành cho bảng điều khiển bên trái (hoặc bảng điều khiển trên cùng cho hướng đó). Tôi sẽ xem xét có thể thay đổi vị trí dải phân cách dựa trên độ rộng ưa thích của các bảng.

+0

xem chỉnh sửa cho vấn đề chính xác –

0

JSplitPanes hơi phức tạp khi nói đến kích thước của trẻ em, hãy xem the Java tutorial. Bạn đang sử dụng GridBagLayout chính xác? Có vẻ như nó không đặt đúng kích cỡ tối thiểu của JPanel đúng cách.

0

Những bí ẩn javax.swing chỉ lộ ra dần dần, và chỉ cho những người sẵn sàng cung cấp nhiều thư viện (đặc biệt là xé tóc, giờ đốt dầu nửa đêm, vv) cho các vị thần Swing.

Tuy nhiên, đối với trường hợp này ở điểm tôi sẽ đề nghị sau đây như là một loại dao quân đội Thụy Sĩ mà thường làm những gì bạn nghĩ khuôn khổ nên làm anyway:

myJPanel.getTopLevelAncestor().validate() 

Như các văn bản thiêng liêng nói, "xác nhận vùng chứa này và tất cả các thành phần con của nó. " (Container.validate). NB getTopLevelAncestor() là một phương thức JComponent.

Không thể nhớ JSplitPane phù hợp với điều này như thế nào: thử nó và bạn có thể thấy rằng nó xác nhận cả hai thành phần (phải và trái, trên và dưới), nhưng tôi sẽ ngạc nhiên nếu thay đổi bộ chia không làm điều này cho bạn anyway.

1

Tôi gặp sự cố tương tự khi sử dụng Netbeans GUI Builder. Tấm bên trong của tôi có kích thước lạ; Tôi đã cố gắng điều chỉnh kích thước tối thiểu và ưa thích theo cách thủ công, đó là một bài tập khó chịu.

Sự cố đã được giải quyết khi tôi đặt lại tất cả kích thước tối thiểu và ưa thích về mặc định (Trong Netbeans GUI Builder: nhấp chuột phải vào thành phần JPanel -> Properties -> preferredSize -> Reset to Default). Khi không có kích thước được áp đặt, jpanel có kích thước của thành phần bên trong.

Lưu ý: GridBaLayout được sử dụng trong trường hợp của tôi

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