2011-09-14 40 views
12

Không chắc chắn nếu những gì tôi cần là có thể. Tôi có một thùng chứa (JPanel) có chứa một số yếu tố bên trong. Tôi đã tự hỏi liệu có thể ép buộc các yếu tố bên trong phù hợp với kích thước của container hay không. Tôi cần chúng hiển thị đầy đủ, nghĩa là, thay đổi kích thước để vừa với kích thước của Bảng điều khiển và không cắt một số phần của phần tử bên trong.Tự động thay đổi kích thước các yếu tố xoay để vừa với kích thước của thùng chứa

Cuộn không phải là một tùy chọn.

Điều này có thể bằng cách sử dụng Bố cục hoặc thứ gì đó không?

CHỈNH SỬA: Làm rõ quan trọng: Vấn đề là tôi không có quyền truy cập vào các thành phần bên trong đối với thuộc tính của chúng, vì vậy tôi có thể nói rằng Layoutmanager có khả năng thay đổi kích thước các phần tử con cho phù hợp với kích thước của nó. Tôi đã thử nghiệm BorderLayout và GridBagLayout nhưng kết quả luôn giống nhau, các phần tử bên trong được cắt bỏ.

+2

' LayoutManager' là giải pháp hiển nhiên. Nếu bạn nói chính xác như thế nào bạn muốn hiển thị các thành phần của bạn, có thể ai đó sẽ đề nghị bạn một 'LayoutManager' thích hợp hơn. – Mohayemin

+1

Câu trả lời 'hiển nhiên' là mở rộng các thành phần (ví dụ: 'JTree'), thêm chúng vào bố cục không có' JScrollPane', gọi 'pack()' trên khung và sau đó 'frame.setMinimumSize (frame.getSize()); Công việc hoàn thành. –

+0

Nghe có vẻ kỳ lạ là bạn không thể truy cập các thuộc tính của "các phần tử bên trong", các phần tử này là 'quyền của JComponent'? Sau đó, bạn có thể truy cập vào bất kỳ thuộc tính chuẩn nào của 'JComponent', kích thước cụ thể. – jfpoilpret

Trả lời

12

Đó là lý do chính xác vì lý do đó LayoutManagers tồn tại. Tất cả các LayoutManagers làm việc cho các thùng chứa đơn giản trực tiếp, ngoại trừ GridBagLayout để có thể xử lý hầu hết các GUI hoàn chỉnh trực tiếp.

Đối với hầu hết cạnh tranh GUI bạn có một số lựa chọn như sau:

  • Hãy tìm một bố cục phần thứ 3 như MigLayout hay here
  • Sử dụng GridBagLayout
  • Rất dễ dàng Cách thứ nhất là sử dụng bố trí lồng nhau, trong đó có nhiều hơn một JPanel và mỗi người có con JPanels với cùng một hoặc khác nhau LayoutManager
  • Hoặc custom layout, nên khó khăn ..., nhưng cũng giống như sử dụng GridBagLayout
+2

Nếu bố cục tùy chỉnh 'giống nhau' như GBL, tại sao không chỉ sử dụng GBL? ;) 1 cho các liên kết và các tùy chọn mặc dù. –

0

bạn có thể sử dụng bố cục, như GridBagLayout hoặc BorderLayout tùy thuộc vào tình huống. Với trọng lượng thích hợp, điều đó là có thể.

5

Bạn có thể đặt bố cục JPanel thành bố cục đường viền, sau đó thêm con duy nhất vào giữa. Nếu có nhiều trẻ em, cách tiếp cận này trở nên kém hữu ích hơn vì các thành phần được thêm vào NORTH, SOUTH, EASTWEST sẽ vẫn ở kích thước tĩnh trong khi trung tâm đổi kích thước để lấp đầy phần còn lại.

Tóm lại, đây không phải là giải pháp lý tưởng. Tất cả việc bố trí trong Swing được thực hiện phức tạp hơn bởi thực tế là các thành phần khác nhau hoạt động theo nhiều cách khác nhau, vì vậy bạn thực sự cần cung cấp thêm chi tiết về các thành phần con bạn muốn thêm vào bảng điều khiển của mình và bất kỳ hành vi nào đã bị ghi đè trên các thành phần.

Cách tốt nhất là thử một vài ví dụ đơn giản để xem số dặm bạn nhận được và liệu thiết kế lại tinh tế của tổ hợp con của bạn có thể hữu ích hay không.

0

điều này nghe với tôi như bạn chỉ cần nhìn trộm một người quản lý bố cục phù hợp và sử dụng nó. Ví dụ, hãy xem BorderLayout - đặt thành phần của bạn vào CENTER và nó sẽ chiếm toàn bộ khu vực. Của nó lên đến mỗi người quản lý bố trí cụ thể để quyết định những gì sẽ là kích thước của các thành phần. Đánh dấu

0

Tôi đã sử dụng một JInternalFrame bên JDesktopPane.Tôi muốn internal_frame để tự động thay đổi kích thước cửa sổ như máy tính để bàn được thay đổi kích cỡ, vì vậy tôi đã phải thực hiện các sự kiện AncestorResized cho khung nội nơi tôi đặt đoạn mã sau:

this.setPreferredSize(this.getParent().getPreferredSize()); 
this.pack(); 

và nó làm việc cho tôi :)

+0

như một khuyến nghị chung: [không sử dụng setXXSize, bao giờ] (http://stackoverflow.com/a/7229519/203657) - cho rằng khung nội bộ có thể được xem như một ngoại lệ, như kích thước của chúng liên quan đến desktopPane mẹ không được kiểm soát bởi LayoutManagers. Nhưng sau đó, câu hỏi không phải là về internalframes, là nó :-) – kleopatra

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