Tôi tìm thấy một ví dụ trong đó nút được thêm vào bảng (trường hợp JPanel
) sau đó bảng được thêm vào các thùng chứa (trường hợp được tạo bởi getContentPane()
) và sau đó vùng chứa, bằng cách xây dựng, được đưa vào JFrame
(cửa sổ).Quan hệ giữa ContentPane và JPanel là gì?
tôi đã cố gắng hai điều:
Tôi đã thoát khỏi những container. Để biết thêm chi tiết, tôi đã thêm các nút vào bảng điều khiển (ví dụ:
JPanel
) và sau đó tôi đã thêm bảng điều khiển vào cửa sổ (ví dụ:JFrame
). Nó hoạt động tốt.Tôi đã loại bỏ các bảng. Để biết thêm chi tiết, tôi đã thêm các nút trực tiếp vào vùng chứa và sau đó tôi thêm vùng chứa vào cửa sổ (ví dụ:
JFrame
).
Vì vậy, tôi không hiểu hai điều.
Tại sao chúng ta có hai cơ chế cạnh tranh để làm những điều tương tự?
Lý do sử dụng vùng chứa kết hợp với các bảng (
JPanel
) là gì? (Ví dụ, những gì chúng tôi bao gồm các nút trong JPanels và sau đó chúng tôi bao gồm JPanels trong Containers). Chúng tôi có thể bao gồmJPanel
trong sốJPanel
không? Chúng ta có thể bao gồm một container trong container?
thêm:
Có lẽ bản chất của câu hỏi của tôi có thể được đưa vào một dòng mã:
frame.getContentPane().add(panel);
gì cho chúng ta đặt getContentPane()
ở giữa? Tôi đã thử chỉ frame.add(panel);
và nó hoạt động tốt.
THÊM 2:
Tôi muốn thêm một số mã để được rõ ràng hơn về những gì tôi có ý nghĩa. Trong ví dụ này tôi sử dụng chỉ JPane:
import java.awt.*;
import javax.swing.*;
public class HelloWorldSwing {
public static void main(String[] args) {
JFrame frame = new JFrame("HelloWorldSwing");
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.add(new JButton("W"), BorderLayout.NORTH);
panel.add(new JButton("E"), BorderLayout.SOUTH);
frame.add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
Và trong ví dụ này tôi sử dụng Pane chỉ Nội dung:
import java.awt.*;
import javax.swing.*;
public class HelloWorldSwing {
public static void main(String[] args) {
JFrame frame = new JFrame("HelloWorldSwing");
Container pane = frame.getContentPane();
pane.setLayout(new BorderLayout());
pane.add(new JButton("W"), BorderLayout.NORTH);
pane.add(new JButton("E"), BorderLayout.SOUTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
Cả hai làm việc tốt! Tôi chỉ muốn biết nếu giữa hai cách để làm những điều tốt hơn (an toàn hơn).
@Nate, ý bạn là gì "Nội bộ, nó sử dụng JPanel". Bạn có nghĩa là Container đang sử dụng JPanel? Ý bạn là như thế nào? Tôi cho rằng JPanel là một phân lớp của Container. Và những gì tôi có thể thay đổi bởi "setContentPane"? ĐƯỢC. Bạn nói rằng Container là một lớp (và tôi luôn coi Container là một lớp). Nhưng JPane cũng là một lớp học. Tại sao chúng ta không thể sử dụng chỉ JPane hay chỉ là Container?Tôi đã có thể làm những điều tương tự bằng cách chỉ sử dụng JPane. Tôi cũng có thể làm tương tự chỉ sử dụng Vùng chứa. – Roman
'JFrame' là nội bộ bằng cách sử dụng một đối tượng' JPanel' để trả về phương thức 'getContentPane()'. Đây là lý do tại sao câu trả lời của Zachary hoạt động. Tham chiếu 'JPanel' thực tế được chôn trong trường' JFrame.rootPane'. Bạn sẽ gọi 'setContentPane()' trên 'JFrame' - ví dụ, bạn có thể thay đổi dòng 10 trong ví dụ đầu tiên của bạn từ' frame.add (panel) 'thành' frame.setContentPane (panel) '. 'Container' là một lớp. 'JPanel' là một lớp (là lớp con của' Vùng chứa'). Bạn đang nhầm lẫn kiểu tham chiếu với loại đối tượng tham chiếu tham chiếu. Hãy nghĩ về 'Container container = new JPanel()' – Nate
@Nate nguồn (http://pragmaticjava.blogspot.com.ar/2008/08/program-to-interface-not-implementation.html) đã bị xóa. – Lucio