Я нашел один пример, в котором кнопки добавляются в панели (экземпляры JPanel
), затем панели добавляются в контейнеры (экземпляры, генерируемые getContentPane()
), а затем контейнеры по конструкции включаются в JFrame
(окна).
Я попробовал две вещи:
Я избавился от контейнеров. Более подробно, я добавил кнопки на панель (экземпляр JPanel
), а затем добавил панель к окнам (экземпляр JFrame
). Работало нормально.
Я избавился от панелей. Более подробно, я добавил кнопки непосредственно в контейнер, а затем добавил контейнер в окно (экземпляр JFrame
).
Итак, я не понимаю двух вещей.
Почему у нас есть два конкурирующих механизма, которые делают одно и то же?
В чем причина использования контейнеров в сочетании с панелями (JPanel
)? (Например, зачем мы включаем кнопки в JPanels, а затем мы включаем JPanels в контейнеры). Можем ли мы включить JPanel
в JPanel
? Можем ли мы включить контейнер в контейнер?
ДОБАВЛЕНО:
Может быть, суть моего вопроса можно заключить в одну строку кода:
frame.getContentPane().add(panel);
Зачем мы ставим getContentPane()
между ними? Я попытался просто frame.add(panel);
, и он отлично работает.
ДОБАВЛЕНО 2:
Я хотел бы добавить код, чтобы было более понятно, что я имею в виду. В этом примере я использую только 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);
}
}
И в этом примере я использую только панель содержимого:
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);
}
}
Оба работают отлично! Я просто хочу знать, если между этими двумя способами сделать что-то лучше (безопаснее).