Я нашел один пример, в котором кнопки добавляются к панелям (экземпляры 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);
}
}
И в этом примере я использую только Content Pane:
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);
}
}
Оба работают отлично! Я просто хочу знать, есть ли между этими двумя способами сделать что-то лучше (безопаснее).