Java: Sự khác biệt giữa phương thức setPreferredSize () và setSize () trong các thành phần


105

Sự khác biệt chính giữa setSize()setPreferredSize(). Đôi khi tôi đã sử dụng setSize(), đôi khi setPreferredSize(), đôi khi một người làm những gì tôi muốn, đôi khi cái khác.

Tôi nên sử dụng cuộc gọi nào cho JFrames và JPanels?

Câu trả lời:


116

Việc sử dụng phụ thuộc vào việc thành phần gốc có trình quản lý bố cục hay không.

  • setSize() - sử dụng khi trình quản lý bố trí mẹ không tồn tại;
  • setPreferredSize()(cũng có liên quan setMinimumSizesetMaximumSize) - sử dụng khi trình quản lý bố cục mẹ tồn tại.

Các setSize()phương pháp có thể sẽ không làm bất cứ điều gì nếu cha mẹ của thành phần được sử dụng một người quản lý bố trí; những nơi mà điều này thường có ảnh hưởng sẽ là ( JFramecác và JWindow) thành phần cấp cao nhất và những thứ nằm bên trong các ngăn được cuộn. Bạn cũng phải gọi setSize()nếu bạn có các thành phần bên trong cha mẹ mà không có trình quản lý bố cục.

Nói chung, setPreferredSize()sẽ bố trí các thành phần như mong đợi nếu có trình quản lý bố trí; hầu hết các trình quản lý bố cục làm việc bằng cách lấy kích thước ưu tiên (cũng như tối thiểu và tối đa) của các thành phần của chúng, sau đó sử dụng setSize()setLocation()định vị các thành phần đó theo quy tắc của bố cục.

Ví dụ: a BorderLayoutcố gắng làm cho các giới hạn của vùng "phía bắc" của nó bằng với kích thước ưu tiên của thành phần phía bắc của nó --- chúng có thể lớn hơn hoặc nhỏ hơn thế, tùy thuộc vào kích thước của JFrame, kích thước của các thành phần khác trong bố cục, v.v.


1
Tôi nghĩ rằng một thành phần đang sử dụng trình quản lý bố cục theo mặc định (BorderLayout?), Vì vậy nếu tôi không đặt trình quản lý bố trí một cách rõ ràng, điều đó có nghĩa là tôi nên sử dụng setSize () thay vì setPreferredSize ()?
David Robles

3
Tôi tin rằng JPanels sử dụng BorderLayout theo mặc định, nhưng JComponent không có bố cục mặc định. Thông thường, bạn nên đặt trình quản lý bố cục nếu bạn sẽ thêm thứ gì đó thay vì sử dụng setSize ().
Sbodd

8
Khuyến nghị của tôi là luôn sử dụng trình quản lý bố cục. SetSize () nên được coi là thứ mà trình quản lý bố trí gọi - không phải thứ mà bạn gọi.
Ngày Kevin

8
@Sbodd - JPanels có FlowLayout theo mặc định. JFrame.getContentPane () có một BorderLayout theo mặc định.
Nemi

10

setSize()hoặc setBounds()có thể được sử dụng khi không sử dụng trình quản lý bố cục.

Tuy nhiên, nếu bạn đang sử dụng trình quản lý bố trí, bạn có thể cung cấp gợi ý cho trình quản lý bố trí bằng cách sử dụng các setXXXSize()phương pháp như setPreferredSize()setMinimumSize()v.v.

Và hãy chắc chắn rằng vùng chứa của thành phần sử dụng trình quản lý bố cục tôn trọng kích thước được yêu cầu. Các FlowLayout, GridBagLayoutSpringLayoutcác trình quản lý sử dụng kích thước ưa thích của thành phần (hai kích thước sau tùy thuộc vào các ràng buộc bạn đặt), nhưng BorderLayoutGridLayoutthường thì không. Nếu bạn chỉ định gợi ý kích thước mới cho một thành phần đã hiển thị, bạn cần gọi phương thức xác thực lại trên nó để đảm bảo rằng hệ thống phân cấp ngăn chặn của nó được bố trí lại. Sau đó gọi phương thức sơn lại.


5

setSize sẽ thay đổi kích thước thành phần thành kích thước được chỉ định.

setPreferredSizeđặt kích thước ưa thích. Thành phần có thể không thực sự có kích thước này tùy thuộc vào kích thước của vùng chứa mà nó nằm trong đó hoặc nếu người dùng định kích thước lại thành phần theo cách thủ công.


Bạn có thể hiển thị một ví dụ đầy đủ về setPreferredSize (...). Tôi nghĩ rằng điều này sẽ hữu ích.
Doug Hauf

4

IIRC ...

setSize đặt kích thước của thành phần.

setPreferredSizeđặt kích thước ưa thích. Layoutmanager sẽ cố gắng sắp xếp nhiều không gian đó cho thành phần của bạn.

Nó phụ thuộc vào việc bạn có đang sử dụng trình quản lý bố cục hay không ...


và điều gì sẽ xảy ra nếu tôi thêm hai jpanels vào một jframe mà không chỉ định rõ ràng trình quản lý bố cục cho jframe? tôi nên sử dụng phương pháp nào để đặt kích thước của jpanels?
David Robles

3
Các ngăn nội dung sử dụng BorderLayout theo mặc định ( java.sun.com/docs/books/tutorial/uiswing/layout/using.html ). Vì vậy, ContentPane của JFrame có LayoutManager, vì vậy phương thức setPreferredSize nên làm việc ..
miku

Âm thanh tốt, đó có nghĩa là tôi nên sử dụng setSize cho JFrame và phương thức setPreferredSize cho các thành phần bên trong
David Robles

1
Thông thường, bạn sẽ sử dụng frame.pack () để tận dụng kích thước ưu tiên được tính toán của tất cả các thành phần con. Ngược lại, nếu bạn chỉ sử dụng ngẫu nhiên frame.setSize (), thì các thành phần được thêm vào ngăn nội dung sẽ mở rộng / co lại để vừa với không gian có sẵn, có nghĩa là kích thước ưu tiên của mỗi thành phần có thể bị ghi đè.
camickr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.