2012-02-07 30 views
8

Tôi biết rằng, as of Java 1.5, người ta có thể thêm một thành phần vào một JFrame như thế này:Tại sao JFrame ban đầu đòi hỏi getContentPane() để thêm các thành phần

myFrame.add (myButton);

thay vì:

myFrame.getContentPane() thêm (myButton);.

Tại sao không phải lúc nào cũng vậy?

+0

lý do tôi cho hỏi là tôi đang giảng dạy Giới thiệu về CS và các ví dụ trong cuốn sách đều sử dụng ký pháp cũ.Tôi muốn có thể cung cấp cho sinh viên một số lý do tại sao nó đã từng cần thiết để làm thêm bước. –

Trả lời

9

Như được viết trong JFrame API, cả hai đều làm điều tương tự: thêm thành phần vào contentPane. Nó chỉ mới đây (Java 1.5 có lẽ?) Swing thêm phương pháp cú pháp/đường cú pháp để cho phép bạn thực hiện cuộc gọi này trực tiếp trên JFrame (hoặc bất kỳ vùng chứa cấp cao Swing nào khác), nhưng bạn vẫn thêm vào contentPane. Tương tự cho remove(...)setLayout(...) Điều này trở nên quá rõ ràng nếu bạn cố gắng đặt màu nền của JFrame qua myJFrame.setBackground(Color.green); và không có gì xảy ra. Chính vì lý do này, tôi không hài lòng với sự thay đổi này. Điều đó và cũng bởi vì tôi phải là một kẻ lừa đảo cũ.

+0

Bạn có thể cho tôi biết lý do bạn không hài lòng với thay đổi này không? Tôi đang cố hiểu lý lẽ chống lại nó. –

+3

Khái niệm này đưa người mới đến tin rằng JFrame thực sự là những gì nhận được thành phần. ** Một lần nữa ** thử gọi setBackground (...) trên JFrame. –

+0

Cảm ơn. Tại sao không làm cho JFrame container ở vị trí đầu tiên vì vậy setBackground() làm những gì mọi người mong đợi? –

7

4753342: thành phần cấp cao nhất của Swing nên chuyển hướng thêm/xóa phương pháp để ContentPane

Mô tả:

Trái ngược với lập trình AWT, JFrame/JDialg/JWindow/JApplet/JInternalFrame không cho phép bạn thêm Component s vào nó, thay vào đó bạn phải tìm hiểu về JRootPane và thêm trẻ em Component s cho nó. Điều này làm tăng thêm sự nhầm lẫn không cần thiết cho các nhà phát triển mới .

Trước 5.0, cố gắng thêm hoặc xóa Component từ một trong số các cấp cao nhất Component s này sẽ dẫn đến ngoại lệ. Trong 5.0, sẽ không có ngoại lệ nào được ném, thay vào đó, Component sẽ được thêm hoặc xóa khỏi ngăn nội dung. Điều này dẫn đến một số sửa đổi đến javadoc của JFrame, JDialog, JWindow, JAppletJInternalFrame. Điều này đã được tóm tắt trong javadoc RootPaneContainer của:

* For conveniance 
* <code>JFrame</code>, <code>JDialog</code>, <code>JWindow</code>, 
* <code>JApplet</code> and <code>JInternalFrame</code>, by default, 
* forward all calls to <code>add</code> and its variants, 
* <code>remove</code> and <code>setLayout</code> to the 
* <code>contentPane</code>. This means rather than writing: 
* <pre> 
* rootPaneContainer.getContentPane().add(component); 
* </pre> 
* you can do: 
* <pre> 
* rootPaneContainer.add(component); 
* </pre> 
* <p> 
* The behavior of <code>add</code> and its variants and 
* <code>setLayout</code> for 
* <code>JFrame</code>, <code>JDialog</code>, <code>JWindow</code>, 
* <code>JApplet</code> and <code>JInternalFrame</code> is controlled by 
* the <code>rootPaneCheckingEnabled</code> property. If this property is 
* true, the default, then <code>add</code> and its variants and 
* <code>setLayout</code> are 
* forwarded to the <code>contentPane</code>, if it is false, then these 
* methods operate directly on the <code>RootPaneContainer</code>. This 
* property is only intended for subclasses, and is therefor protected. 

Ngoài ra, đây là một lỗi liên quan:

+0

Thông tin rất hữu ích! 1+ –

+0

Rất hữu ích, cảm ơn. – Alanmars

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