I found one example in which buttons are added to panels (instances of JPanel
) then panels are added to the the containers (instances generated by getContentPane()
) and then containers are, by the construction, included into the JFrame
(the windows).
I tried two things:
I got rid of the containers. In more details, I added buttons to a panel (instance of
JPanel
) and then I added the panel to the windows (instance ofJFrame
). It worked fine.I got rid of the panels. In more details, I added buttons directly to the container and then I added the container to the window (instance of
JFrame
).
So, I do not understand two things.
Why do we have two competing mechanism to do the same things?
What is the reason to use containers in combination with the panels (
JPanel
)? (For example, what for we include buttons in JPanels and then we include JPanels in the Containers). Can we includeJPanel
inJPanel
? Can we include a container in container?
ADDED:
Maybe essence of my question can be put into one line of code:
frame.getContentPane().add(panel);
What for we put getContentPane()
in between? I tried just frame.add(panel);
and it works fine.
ADDED 2:
I would like to add some code to be more clear about what I mean. In this example I use only 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);
}
}
And in this example I use only 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);
}
}
Both work fine! I just want to know if between these two ways to do things one is better (safer).
See Question&Answers more detail:os