JPanel is a Swing’s lightweight container which is used to group a set of components together. JPanel is a pretty simple component which, normally, does not have a GUI (except when it is being set an opaque background or has a visual border).
In this article, we summarize the common practices when working with JPanel in Swing. At the end, we will create a sample program looks like this:
Table of content:
The JPanel class resides in the package javax.swing and it’s a subclass of the javax.swing.JComponent class.
JPanel newPanel = new JPanel();
That creates a new JPanel with double enabled by default.
public class UserDetail extends JPanel { // code to add components to the panel }
JPanel newPanel = new JPanel(true); // enable double buffering JPanel newPanel = new JPanel(false); // disable double buffering
JPanel newPanel = new JPanel(new GridBagLayout()); JPanel newPanel = new JPanel(new BorderLayout());
By default, the panel has a flow layout manager.
// use grid bag layout and no double buffering: JPanel newPanel = new JPanel(new GridBagLayout(), false);
JPanel newPanel = new JPanel(); newPanel.setLayout(new GridBagLayout());
// NOT recommended: JPanel newPanel = new JPanel(); // a FlowLayout manager is created by default newPanel.setLayout(new GridBagLayout()); // RECOMMENDED: JPanel newPanel = new JPanel(new GridBagLayout());
// exception: JPanel newPanel = new JPanel(); newPanel.setLayout(new BoxLayout(newPanel, BoxLayout.X_AXIS));
To add GUI components such as JLabel, JTextField, JButton... to the panel, we use the add() method. There are different versions of the add() method, so which method to be used is depending on the layout manager of the panel.
JLabel label = new JLabel("Enter username:"); JTextField userName = new JTextField(20); newPanel.add(label); newPanel.add(userName);
JPanel newPanel = new JPanel(new BorderLayout()); JLabel label = new JLabel("Enter username:"); JTextField userName = new JTextField(20); newPanel.add(label, BorderLayout.NORTH); newPanel.add(userName, BorderLayout.SOUTH);
GridBagConstraints constraints = new GridBagConstraints(); constraints.anchor = GridBagConstraints.WEST; constraints.insets = new Insets(10, 10, 10, 10); constraints.gridx = 0; constraints.gridy = 0; newPanel.add(labelUsername, constraints);
JPanel wizardPanel = new JPanel(new CardLayout()); wizardPanel.add("Step1", step1Panel); wizardPanel.add("Step2", step2Panel);
The panel cannot stand alone. It must be added to a parent container such as a JFrame or another JPanel. For example:
frame.add(newPanel); anotherPanel.add(newPanel);
Normally, a JPanel does not render its own GUI. However we can set its background color, transparent background or border when necessary.
newPanel.setBackground(Color.CYAN);
newPanel.setOpaque(false); // make transparent background
newPanel.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
newPanel.setBorder(BorderFactory.createEtchedBorder());
newPanel.setBorder(BorderFactory.createLineBorder(Color.RED));
newPanel.setBorder(BorderFactory.createTitledBorder( BorderFactory.createEtchedBorder(), "Login Panel"));
We created the following program to demonstrate the typical usages of JPanel in a Swing application. The program uses a JPanel to group some labels, textfields and a button to form a login panel as follows:
As you can notice, the panel used in this program has a titled border “Login Panel”. Here is complete source code of the program:
package net.codejava.swing.jpanel; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.UIManager; /** * This program demonstrates how to use JPanel in Swing. * @author www.codejava.net */ public class SwingJPanelDemo extends JFrame { private JLabel labelUsername = new JLabel("Enter username: "); private JLabel labelPassword = new JLabel("Enter password: "); private JTextField textUsername = new JTextField(20); private JPasswordField fieldPassword = new JPasswordField(20); private JButton buttonLogin = new JButton("Login"); public SwingJPanelDemo() { super("JPanel Demo Program"); // create a new panel with GridBagLayout manager JPanel newPanel = new JPanel(new GridBagLayout()); GridBagConstraints constraints = new GridBagConstraints(); constraints.anchor = GridBagConstraints.WEST; constraints.insets = new Insets(10, 10, 10, 10); // add components to the panel constraints.gridx = 0; constraints.gridy = 0; newPanel.add(labelUsername, constraints); constraints.gridx = 1; newPanel.add(textUsername, constraints); constraints.gridx = 0; constraints.gridy = 1; newPanel.add(labelPassword, constraints); constraints.gridx = 1; newPanel.add(fieldPassword, constraints); constraints.gridx = 0; constraints.gridy = 2; constraints.gridwidth = 2; constraints.anchor = GridBagConstraints.CENTER; newPanel.add(buttonLogin, constraints); // set border for the panel newPanel.setBorder(BorderFactory.createTitledBorder( BorderFactory.createEtchedBorder(), "Login Panel")); // add the panel to this frame add(newPanel); pack(); setLocationRelativeTo(null); } public static void main(String[] args) { // set look and feel to the system look and feel try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception ex) { ex.printStackTrace(); } SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new SwingJPanelDemo().setVisible(true); } }); } }
You can download the code as well as an executable jar file of this program in the attachments section.