Any Swing component can have a decorative
border.
JComponent
includes a method called
setBorder( )
; all you have to do is call
setBorder( )
, passing it an appropriate
implementation of the
Border
interface.
Swing provides many useful Border
implementations
in the javax.swing.border
package. You could
create an instance of one of these classes and pass it to a
component’s setBorder( )
method, but
there’s an even simpler technique.
The BorderFactory
class can create any kind of border for
you using static “factory” methods. Creating and setting
a component’s border, then, is simple:
JLabel labelTwo = new JLabel("I have an etched border."); labelTwo.setBorder(BorderFactory.createEtchedBorder( ));
Every component has a setBorder( )
method, from
simple labels and buttons right up to the fancy text and table
components we’ll cover in the next chapter.
BorderFactory
is convenient, but it does not offer
every option of every border type. For example, if you want to create
a raised EtchedBorder
instead of the default
lowered border, you’ll need to use
EtchedBorder
’s constructor rather than a
method in BorderFactory
, like this:
JLabel labelTwo = new JLabel("I have a raised etched border."); labelTwo.setBorder( new EtchedBorder(EtchedBorder.RAISED) );
The Border
implementation classes are listed and
briefly described here:
-
BevelBorder
This border draws raised or lowered beveled edges, giving an illusion of depth.
-
SoftBevelBorder
This border is similar to
BevelBorder
, but thinner.-
EmptyBorder
Doesn’t do any drawing, but does take up space. You can use it to give a component a little breathing room in a crowded user interface.
-
EtchedBorder
A lowered etched border gives the appearance of a rectangle that has been chiseled into a piece of stone. A raised etched border looks like it is standing out from the surface of the screen.
-
LineBorder
Draws a simple rectangle around a component. You can specify the color and width of the line in
LineBorder
’s constructor.-
MatteBorder
A souped-up version of
LineBorder
. You can create aMatteBorder
with a certain color and specify the size of the border on the left, top, right, and bottom of the component.MatteBorder
also allows you to pass in anIcon
that will be used to draw the border. This could be an image (ImageIcon
) or any other implementation of theIcon
interface.-
TitledBorder
A regular border with a title.
TitledBorder
doesn’t actually draw a border; it just draws a title in conjunction with another border object. You can specify the locations of the title, its justification, and its font. This border type is particularly useful for grouping different sets of controls in a complicated interface.-
CompoundBorder
A border that contains two other borders. This is especially handy if you want to enclose a component in an
EmptyBorder
and then put something decorative around it, like anEtchedBorder
or aMatteBorder
.
The following example shows off some different border types. It’s only a sampler, though; many more border types are available. Furthermore, the example only encloses labels with borders. You can put a border around any component in Swing. The example is shown in Figure 14.3; the source code follows.
//file: Borders.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; public class Borders { public static void main(String[] args) { // create a JFrame to hold everything JFrame f = new JFrame("Borders"); f.addWindowListener(new WindowAdapter( ) { public void windowClosing(WindowEvent we) { System.exit(0); } }); f.setSize(300, 300); f.setLocation(200, 200); // Create labels with borders. int center = SwingConstants.CENTER; JLabel labelOne = new JLabel("raised BevelBorder", center); labelOne.setBorder( BorderFactory.createBevelBorder(BevelBorder.RAISED)); JLabel labelTwo = new JLabel("EtchedBorder", center); labelTwo.setBorder(BorderFactory.createEtchedBorder( )); JLabel labelThree = new JLabel("MatteBorder", center); labelThree.setBorder( BorderFactory.createMatteBorder(10, 10, 10, 10, Color.pink)); JLabel labelFour = new JLabel("TitledBorder", center); Border etch = BorderFactory.createEtchedBorder( ); labelFour.setBorder( BorderFactory.createTitledBorder(etch, "Title")); JLabel labelFive = new JLabel("TitledBorder", center); Border low = BorderFactory.createLoweredBevelBorder( ); labelFive.setBorder( BorderFactory.createTitledBorder(low, "Title", TitledBorder.RIGHT, TitledBorder.BOTTOM)); JLabel labelSix = new JLabel("CompoundBorder", center); Border one = BorderFactory.createEtchedBorder( ); Border two = BorderFactory.createMatteBorder(4, 4, 4, 4, Color.blue); labelSix.setBorder(BorderFactory.createCompoundBorder(one, two)); // add components to the content pane Container c = f.getContentPane( ); c.setLayout(new GridLayout(3, 2)); c.add(labelOne); c.add(labelTwo); c.add(labelThree); c.add(labelFour); c.add(labelFive); c.add(labelSix); f.setVisible(true); } }
Get Learning Java now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.