|
| |
Often, you would like to enclose a set of visual components within a border
of some kind. For example, it is often helpful for a set of radio buttons
in a single button group to be enclosed in a "group box", often with a
title of some kind to help the user understand what's expected of him/her.
Note: This kind of border has
nothing to do with the BorderLayout class.
Swing provides a number of border choices. Here is an example that
shows you what they look like:
package swingExamples;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.border.Border;
class BordersPanel extends JPanel
{
public BordersPanel()
{
setLayout( new BorderLayout() );
add(new OuterPanel(), BorderLayout.CENTER);
add(new InputPanel(), BorderLayout.SOUTH);
}
public void setPanelBorder()
{
Border border = null;
if (m_borderCommand.equals(LOWERED_BEVEL))
{
border = BorderFactory.createLoweredBevelBorder();
}
else if (m_borderCommand.equals(RAISED_BEVEL))
{
border = BorderFactory.createRaisedBevelBorder();
}
else if (m_borderCommand.equals(ETCHED))
{
border = BorderFactory.createEtchedBorder();
}
else if (m_borderCommand.equals(LINE))
{
border = BorderFactory.createLineBorder(Color.blue);
}
else if (m_borderCommand.equals(MATTE))
{
border = BorderFactory.createMatteBorder(3, 3, 3, 3,
Color.darkGray);
}
else if (m_borderCommand.equals(EMPTY))
{
border = BorderFactory.createEmptyBorder();
}
m_borderPanel.setBorder(border);
}
/////// Private data /////
private static final String LOWERED_BEVEL = "Lowered bevel";
private static final String RAISED_BEVEL = "Raised bevel";
private static final String ETCHED = "Etched";
private static final String LINE = "Line";
private static final String MATTE = "Matte";
private static final String EMPTY = "Empty";
private String m_borderCommand = EMPTY; // Current border style
private BorderPanel m_borderPanel = new BorderPanel();
/////// Inner classes /////
class OuterPanel extends JPanel
{
public OuterPanel()
{
setBackground(Color.pink);
setLayout( new BorderLayout() );
add(m_borderPanel, BorderLayout.CENTER);
}
public Insets getInsets()
{
return new Insets(10, 10, 10, 10);
}
}
class BorderPanel extends JPanel
{
}
class InputPanel extends JPanel
implements ActionListener
{
public InputPanel()
{
setBackground(Color.cyan);
Border etched = BorderFactory.createEtchedBorder();
Border titled =
BorderFactory.createTitledBorder(
etched, "Choose Border:");
setBorder(titled);
addRadioButton(LOWERED_BEVEL);
addRadioButton(RAISED_BEVEL);
addRadioButton(ETCHED);
addRadioButton(LINE);
addRadioButton(MATTE);
addRadioButton(EMPTY).setSelected(true);
}
public void actionPerformed(ActionEvent ev)
{
m_borderCommand = m_group.getSelection().getActionCommand();
setPanelBorder();
}
private JRadioButton addRadioButton(String command)
{
JRadioButton button = new JRadioButton(command);
button.setOpaque(false);
add(button);
m_group.add(button);
button.addActionListener(this);
button.setActionCommand(command);
return button;
}
///////// Private data ////////
private ButtonGroup m_group = new ButtonGroup();
}
}
class BordersFrame extends JFrame
{
public BordersFrame()
{
setTitle("Borders");
setSize(500, 150);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container contentPane = getContentPane();
contentPane.add( new BordersPanel() );
}
}
public class Borders
{
public static void main(String[] args)
{
BordersFrame frame = new BordersFrame();
frame.setVisible(true);
}
}
|
which produces:
Points to Note:
- I used
Insets to produce a margin in the upper pane, so that
the results could more easily be seen.
- I applied
setOpaque(false) to each of the radio
buttons. If I had not done so, the results would have looked like
this:

Not nice!
|