Any Swing component can have a decorative border. JComponent
includes a method called setBorder()
; all you
have to do is call it, 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 creates
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 that we cover in Chapter 18.
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, 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
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, such as 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 17-6.
//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
frame
=
new
JFrame
(
"Borders"
);
// 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
();
// unnecessary in 5.0+
c
.
setLayout
(
new
GridLayout
(
3
,
2
));
c
.
add
(
labelOne
);
c
.
add
(
labelTwo
);
c
.
add
(
labelThree
);
c
.
add
(
labelFour
);
c
.
add
(
labelFive
);
c
.
add
(
labelSix
);
frame
.
setDefaultCloseOperation
(
JFrame
.
EXIT_ON_CLOSE
);
frame
.
pack
();
frame
.
setVisible
(
true
);
}
}
Get Learning Java, 4th Edition 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.