12.2.3 为组件设置边框

12.2.3 为组件设置边框

可以调用JComponent提供的setBorder(Border b)方法为Swing组件设置边框,其中BorderSwing提供的一个接口,用于代表组件的边框。该接口有数量众多的实现类,如LineBorderMatteBorderBevelBorder等,这些Border实现类都提供了相应的构造器用于创建Border对象,一旦获取了Border对象之后,就可以调用JComponentsetBorder(Border b)方法为指定组件设置边框。

TitledBorderCompoundBorder比较独特,其中TitledBorder的作用并不是为其他组件添加边框,而是为其他边框设置标题,当创建TitledBorder对象时,需要传入一个已经存在的Border对象,新创建的TitledBorder对象会为原有的Border对象添加标题;而CompoundBorder用于组合两个边框,因此创建CompoundBorder对象时需要传入两个Border对象,一个用作组件的内边框,一个用作组件的外边框。

除此之外,Swing还提供了一个BorderFactory静态工厂类,该类提供了大量的静态工厂方法用于返回Border实例,这些静态方法的参数与各Border实现类的构造器参数基本一致。

Border不仅提供了上面所提到的一些Border实现类,还提供了 MetalBorders.ToolBarBorderMetalBorders.TextFieldBorderBorder实现类,这些实现类用作Swing组件的默认边框,程序中通常无须使用这些系统边框。

Swing组件添加边框可按如下步骤进行:

  • 使用BorderFactory或者XxxBorder创建XxxBorder实例。
  • 调用Swing组件的setBorder(Border b)方法为该组件设置边框

图12.5显示了系统可用边框之间的继承层次

这里有一张图片

程序 为Panel容器添加边框

下面的例子程序示范了为Panel容器分别添加如图12.5所示的几种边框。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;

public class BorderTest {
private JFrame jf = new JFrame("测试边框");

public void init() {
jf.setLayout(new GridLayout(2, 4));
// 使用静态工厂方法创建BevelBorder
Border bb = BorderFactory.createBevelBorder(BevelBorder.RAISED, Color.RED, Color.GREEN, Color.BLUE, Color.GRAY);
jf.add(getPanelWithBorder(bb, "BevelBorder"));
// 使用静态工厂方法创建LineBorder
Border lb = BorderFactory.createLineBorder(Color.ORANGE, 10);
jf.add(getPanelWithBorder(lb, "LineBorder"));
// 使用静态工厂方法创建EmptyBorder,EmptyBorder就是在组件四周留空
Border eb = BorderFactory.createEmptyBorder(20, 5, 10, 30);
jf.add(getPanelWithBorder(eb, "EmptyBorder"));
// 使用静态工厂方法创建EtchedBorder
Border etb = BorderFactory.createEtchedBorder(EtchedBorder.RAISED, Color.RED, Color.GREEN);
jf.add(getPanelWithBorder(etb, "EtchedBorder"));
// 直接创建TitledBorder,TitledBorder边框就是为原有的边框增加标题
TitledBorder tb = new TitledBorder(lb, "测试标题", TitledBorder.LEFT, TitledBorder.BOTTOM,
new Font("StSong", Font.BOLD, 18), Color.BLUE);
jf.add(getPanelWithBorder(tb, "TitledBorder"));
// 直接创建MatteBorder,MatteBorder边框是EmptyBorder的子类,
// 它可以指定留空区域的颜色或背景,此处是指定颜色
MatteBorder mb = new MatteBorder(20, 5, 10, 30, Color.GREEN);
jf.add(getPanelWithBorder(mb, "MatteBorder"));
// 直接创建CompoundBorder,CompoundBorder边框将两个边框组合成新边框
CompoundBorder cb = new CompoundBorder(new LineBorder(Color.RED, 8), tb);
jf.add(getPanelWithBorder(cb, "CompoundBorder"));
jf.pack();
jf.setVisible(true);
}

public static void main(String[] args) {
new BorderTest().init();
}

public JPanel getPanelWithBorder(Border b, String BorderName) {
JPanel p = new JPanel();
p.add(new JLabel(BorderName));
// 为Panel组件设置边框
p.setBorder(b);
return p;
}
}

运行上面程序,会看到如图12.6所示的效果。

这里有一张图片