Swing introduction  Swing components  Events and listeners  Text fields/labels  Layouts  JPanel and Box


Threads Database Profiling Regular expressions Random numbers Compression Exceptions C Equivalents in Java
 Comment on this article  List of Java topics

JPanel and Box

On the previous page, we saw some basic user interface layouts, notably the BorderLayout. Whilst BorderLayout is very useful for certain typical layouts, it's also clear that it's not sufficient for many cases, and that GridLayout is also somewhat restrictive. On this page, we look at two further tools that can be used to create more complex layouts: the JPanel and the Box.

JPanel

A JPanel is a component that has no functionality other than to hold other components. Just like a frame, you can assign any layout to a JPanel, then put the panel itself in one of the positions of a frame or another panel.

For example, let's consider how to create a login window. The frame itself uses a BorderLayout. The NORTH position is used for a label containing a "Please log in" message, or any other messages that occur during login:

public class LoginFrame extends JFrame {
  private JTextField statusField = new JTextField(20);
  private JTextField userNameField = new JTextField(10);
  private JTextField passwordField = new JTextField(10);
  private JButton loginButton = new JButton("Log in");
  private JButton cancelButton = new JButton("Cancel");

  public LoginFrame() {
    super("Login");
    statusField.setEditable(false);
    add(statusField, BorderLayout.NORTH);
    ... rest of code here
  }
}

The SOUTH position is used for a button bar containing Log in and Cancel buttons— we'll come back to how to implement this in a moment. Then in the central position, we put a JPanel. That JPanel has a GridLayout and contains the 'user name' and 'password' fields and corresponding labels:

JPanel p = new JPanel();
p.setLayout(new GridLayout(2, 2));
p.add(new JLabel("User name:"));
p.add(userNameField);
p.add(new JLabel("Password:"));
p.add(passwordField);
add(p, BorderLayout.CENTER);

Box

A Box, like a JPanel, also contains other Swing components. But it always has a special layout, in which the components run vertically or horizontally. It is useful for implementing various elements of a window such as button bars or lines of components. So for our login window, we create our button bar as a horizontal box as follows:

Box buttonBar = Box.createHorizontalBox();
buttonBar.add(Box.createHorizontalGlue());
buttonBar.add(cancelButton);
buttonBar.add(loginButton);
add(buttonBar, BorderLayout.SOUTH);

Notice that we use the special static method Box.createHorizontalBox() rather than using the Box constructor directly. The Box method also contains static methods for creating a couple of useful elements to place inside boxes. Here, we use the method Box.createHorizontalGlue() to insert "glue" before the two buttons. Glue acts as a filler, occupying the available space between other components, and has the effect of right-aligning the buttons:


Glue (red arrow) occupies the available space not occupied by other components in the Box. Here, putting horizontal glue before the two buttons has the effect of right-aligning them.

To centre components in a box, we can put glue before and after the components. We can also spread components out in the box by putting glue between them.

Other components

Now you've seen the basics of Swing programming, you may wish to take a look at the Swing components overview, where you can find out about some other common Swing components.


Unless otherwise stated, the Java programming articles and tutorials on this site are written by Neil Coffey. Suggestions are always welcome if you wish to suggest topics for Java tutorials or programming articles, or if you simply have a programming question that you would like to see answered on this site. Most topics will be considered. But in particular, the site aims to provide tutorials and information on topics that aren't well covered elsewhere, or on Java performance information that is poorly described or understood. Suggestions may be made via the Javamex blog (see the site's front page for details).
Copyright © Javamex UK 2009. All rights reserved.