文档

Java™教程
隐藏目录
如何使用边框
路径: 使用 Swing 创建 GUI
课程: 使用 Swing 组件

如何使用边框

每个JComponent都可以有一个或多个边框。边框是非常有用的对象,它们虽然不是组件本身,但知道如何绘制Swing组件的边缘。边框不仅用于绘制线条和精美的边缘,还可以提供标题和组件周围的空白空间。


注意: 

我们的示例在JPanelJLabelJComponent的自定义子类上设置了边框。尽管从技术上讲,您可以在从JComponent继承的任何对象上设置边框,但许多标准Swing组件的外观和感觉实现与用户设置的边框不兼容。通常情况下,当您想在JPanelJLabel之外的标准Swing组件上设置边框时,建议将组件放在JPanel中并在JPanel上设置边框。


要在JComponent周围放置边框,可以使用其setBorder方法。您可以使用BorderFactory类创建Swing提供的大多数边框。如果您需要对边框进行引用 - 例如,因为您想在多个组件中使用它 - 您可以将其保存在类型为Border的变量中。下面是创建带边框的容器的代码示例:

JPanel pane = new JPanel();
pane.setBorder(BorderFactory.createLineBorder(Color.black));

下面是一个包含标签组件的容器的图片。由边框绘制的黑色线条标记了容器的边缘。

A line border

本页面的其余部分讨论以下主题:

BorderDemo示例

下面的图片显示了一个名为BorderDemo的应用程序,显示了Swing提供的边框。稍后在使用Swing提供的边框中,我们将展示创建这些边框的代码。

点击“启动”按钮,使用Java™ Web Start运行BorderDemo示例(下载JDK 7或更高版本)。或者,要自行编译和运行示例,请参考示例索引

启动BorderDemo示例
BorderDemo:简单边框

下图显示了一些亚光边框。创建亚光边框时,您需要指定组件的顶部、左侧、底部和右侧各占据多少像素。然后,您可以指定亚光边框要绘制的颜色或图标。在选择图标和确定组件大小时需要小心,否则图标可能会被截断或在组件的角落上不匹配。

BorderDemo:亚光边框

下图显示了带标题的边框。使用标题边框,您可以将任何边框转换为显示文本描述的边框。如果您不指定边框,则使用特定于外观的边框。例如,Java外观中的默认标题边框使用灰线,Windows外观中的默认标题边框使用蚀刻边框。默认情况下,标题横跨边框的左上角,如下图顶部所示。

BorderDemo:带标题的边框

下图显示了复合边框。使用复合边框,您可以组合任何两个边框,这两个边框本身可以是复合边框。

BorderDemo:复合边框

使用Swing提供的边框

下面的代码示例显示了如何创建和设置前面图中显示的边框。您可以在BorderDemo.java中找到程序的代码。

//保留对下一些边框的引用,用于标题和复合边框。
Border blackline, raisedetched, loweredetched,
       raisedbevel, loweredbevel, empty;

blackline = BorderFactory.createLineBorder(Color.black);
raisedetched = BorderFactory.createEtchedBorder(EtchedBorder.RAISED);
loweredetched = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);
raisedbevel = BorderFactory.createRaisedBevelBorder();
loweredbevel = BorderFactory.createLoweredBevelBorder();
empty = BorderFactory.createEmptyBorder();

//简单边框
jComp1.setBorder(blackline);
jComp2.setBorder(raisedbevel);
jComp3.setBorder(loweredbevel);
jComp4.setBorder(empty);

//Matte边框
ImageIcon icon = createImageIcon("images/wavy.gif",
                                 "波浪线边框图标"); //20x22

jComp5.setBorder(BorderFactory.createMatteBorder(
                                   -1, -1, -1, -1, icon));
jComp6.setBorder(BorderFactory.createMatteBorder(
                                    1, 5, 1, 1, Color.red));
jComp7.setBorder(BorderFactory.createMatteBorder(
                                    0, 20, 0, 0, icon));

//带标题的边框
TitledBorder title;
title = BorderFactory.createTitledBorder("标题");
jComp8.setBorder(title);

title = BorderFactory.createTitledBorder(
                       blackline, "标题");
title.setTitleJustification(TitledBorder.CENTER);
jComp9.setBorder(title);

title = BorderFactory.createTitledBorder(
                       loweredetched, "标题");
title.setTitleJustification(TitledBorder.RIGHT);
jComp10.setBorder(title);

title = BorderFactory.createTitledBorder(
                       loweredbevel, "标题");
title.setTitlePosition(TitledBorder.ABOVE_TOP);
jComp11.setBorder(title);

title = BorderFactory.createTitledBorder(
                       empty, "标题");
title.setTitlePosition(TitledBorder.BOTTOM);
jComp12.setBorder(title);

//复合边框
Border compound;
Border redline = BorderFactory.createLineBorder(Color.red);

//这样创建一个漂亮的框架。
compound = BorderFactory.createCompoundBorder(
                          raisedbevel, loweredbevel);
jComp13.setBorder(compound);

//在框架上加上红色轮廓。
compound = BorderFactory.createCompoundBorder(
                          redline, compound);
jComp14.setBorder(compound);

//在红色轮廓的框架上加上标题。
compound = BorderFactory.createTitledBorder(
                          compound, "标题",
                          TitledBorder.CENTER,
                          TitledBorder.BELOW_BOTTOM);
jComp15.setBorder(compound);

你可能已经注意到,该代码使用BorderFactory类创建每个边框。 BorderFactory类位于javax.swing包中,返回实现Border接口的对象。

Border接口以及其Swing提供的实现都位于javax.swing.border包中。通常情况下,您不需要直接使用边框包中的任何内容,除非指定特定边框类的常量或引用Border类型。

创建自定义边框

如果BorderFactory不能提供足够对边框形式的控制,那么您可能需要直接使用边框包中的API,甚至定义自己的边框。除了包含Border接口外,边框包还包含实现您已经见过的边框的类:LineBorderEtchedBorderBevelBorderEmptyBorderMatteBorderTitledBorderCompoundBorder。边框包还包含一个名为SoftBevelBorder的类,它产生与BevelBorder类似但边缘更柔和的效果。

如果没有适合的Swing边框,您可以实现自己的边框。通常,您可以通过创建AbstractBorder类的子类来实现这一点。在子类中,您必须实现至少一个构造函数和以下两个方法:

如果自定义边框有内边距(它们通常有内边距),您需要覆盖AbstractBorder.getBorderInsets(Component c)AbstractBorder.getBorderInsets(Component c, Insets insets)两个方法以提供正确的内边距。

有关实现边框的示例,请参阅javax.swing.border包中类的源代码。

边框 API

以下表格列出了常用的边框方法。使用边框的 API 分为两类:

使用BorderFactory创建边框Border createLineBorder(Color)
Border createLineBorder(Color, int)java.awt.ColorBorder createEtchedBorder()
Border createEtchedBorder(Color, Color)
Border createEtchedBorder(int)
Border createEtchedBorder(int, Color, Color)ColorintEtchedBorder.RAISEDEtchedBorder.LOWEREDintBorder createLoweredBevelBorder()Border createRaisedBevelBorder()
Border createBevelBorder(int, Color, Color)
Border createBevelBorder(int, Color, Color, Color, Color)BevelBorder.RAISEDBevelBorder.LOWEREDcreateEmptyBorder()方法
createEmptyBorder(int, int, int, int)方法createMatteBorder(int, int, int, int, Color)方法
createMatteBorder(int, int, int, int, Icon)方法TitledBorder createTitledBorder(String)
TitledBorder createTitledBorder(Border)
TitledBorder createTitledBorder(Border, String)
TitledBorder createTitledBorder(Border, String, int, int)
TitledBorder createTitledBorder(Border, String, int, int, Font)
TitledBorder createTitledBorder(Border, String, int, int, Font, Color)

默认情况下,标题跨越其伴随边框的顶部并左对齐。可选的整数参数按顺序指定标题的位置和对齐方式。TitledBorder定义了以下可能的位置:ABOVE_TOPTOP(默认),BELOW_TOPABOVE_BOTTOMBOTTOMBELOW_BOTTOM。您可以将对齐方式指定为LEADING(默认),CENTERTRAILING。在使用西方字母表的语言环境中,LEADING相当于LEFTTRAILING相当于RIGHT


CompoundBorder createCompoundBorder(Border, Border)
设置或获取组件的边框
方法 目的
void setBorder(Border)
Border getBorder()
设置或获取接收到的JComponent的边框。
void setBorderPainted(boolean)
boolean isBorderPainted()
(在AbstractButtonJMenuBarJPopupMenuJProgressBarJToolBar中)
设置或获取组件的边框是否显示。

使用边框的示例

本课程中的许多示例都使用边框。以下表格列出了一些有趣的案例。

示例 描述位置 备注
BorderDemo 本节 显示了BorderFactory可以创建的每种类型的边框示例。还使用了空边框在每个窗格和其内容之间添加间隔。
BoxAlignmentDemo 使用BoxLayout 使用了标题边框。
BoxLayoutDemo 使用BoxLayout 使用红线显示容器的边缘位置,以便您可以看到盒子布局中的额外空间如何分配。
ComboBoxDemo2 使用组合框 使用复合边框将线边框与空边框组合。空边框提供了线和组件内部之间的间隔。

上一页: 如何使用图标
下一页: 解决常见组件问题