如何使用边框

每个JComponent可以有一个或多个边界。边框是非常有用的对象,它们本身并不是组件,但知道如何绘制 Swing 组件的边缘。边框不仅可用于绘制线条和奇特的边缘,而且还可在组件周围提供标题和空白区域。

Note:

我们的示例在JPanelJLabel s 和JComponent的自定义子类上设置了边界。尽管从技术上讲,您可以在继承自JComponent的任何对象上设置边框,但是许多标准 Swing 组件的外观实现都无法与用户设置的边框配合使用。通常,当您要在JPanelJLabel以外的标准 Swing 组件上设置边框时,建议将组件放在JPanel并将边框设置在JPanel上。

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

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

这是容器的图片,其中包含标签组件。边框画出的黑线表示容器的边缘。

线边框

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

BorderDemo 示例

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

单击启动按钮以使用Java™Web 开始(下载 JDK 7 或更高版本)运行 BorderDemo 示例。另外,要自己编译和运行示例,请查阅example index

BorderDemo:简单边框

下一张图片显示了一些磨砂边框。创建遮罩边框时,可以指定其在组件的顶部,左侧,底部和右侧占据多少像素。然后,您可以为遮罩边框指定颜色或图标。在选择图标并确定组件的尺寸时,需要小心;否则,该图标可能会被切掉或在组件的角处不匹配。

BorderDemo:遮罩边框

下一张图片显示标题边框。使用标题边框,您可以将任何边框转换为显示文本说明的边框。如果您未指定边框,则使用外观特定的边框。例如,Java 外观中的默认标题边框使用灰线,而 Windows 外观中的默认标题边框使用 Eclipse 刻的边框。默认情况下,标题跨越边框的左上方,如下图顶部所示。

BorderDemo:标题边框

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

BorderDemo:复合边框

使用 Swing 提供的边框

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

//Keep references to the next few borders,
//for use in titles and compound borders.
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();

//Simple borders
jComp1.setBorder(blackline);
jComp2.setBorder(raisedbevel);
jComp3.setBorder(loweredbevel);
jComp4.setBorder(empty);

//Matte borders
ImageIcon icon = createImageIcon("images/wavy.gif",
                                 "wavy-line border icon"); //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));

//Titled borders
TitledBorder title;
title = BorderFactory.createTitledBorder("title");
jComp8.setBorder(title);

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

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

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

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

//Compound borders
Border compound;
Border redline = BorderFactory.createLineBorder(Color.red);

//This creates a nice frame.
compound = BorderFactory.createCompoundBorder(
                          raisedbevel, loweredbevel);
jComp13.setBorder(compound);

//Add a red outline to the frame.
compound = BorderFactory.createCompoundBorder(
                          redline, compound);
jComp14.setBorder(compound);

//Add a title to the red-outlined frame.
compound = BorderFactory.createTitledBorder(
                          compound, "title",
                          TitledBorder.CENTER,
                          TitledBorder.BELOW_BOTTOM);
jComp15.setBorder(compound);

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

Borderinterface及其 Swing 提供的实现位于javax.swing.border包中。除了指定特定于特定边框类的常量或引用Border类型时,您通常不需要直接在 border 包中使用任何东西。

创建自定义边框

如果BorderFactory不能为您提供对边框形式的足够控制,则您可能需要直接在 border 包中使用 API-甚至定义自己的边框。除了包含Borderinterface之外,border 包还包含实现您已经看到的边框的类:LineBorderEtchedBorderBevelBorderEmptyBorderMatteBorderTitledBorderCompoundBorder。 border 包还包含一个名为SoftBevelBorder的类,该类产生的结果类似于BevelBorder,但边缘更柔和。

如果任何一个 Swing 边框都不适合,则可以实现自己的边框。通常,您可以通过创建AbstractBorder类的子类来完成此操作。在子类中,必须实现至少一个构造函数和以下两个方法:

  • paintBorder,其中包含JComponent执行的绘制代码以绘制边框。

  • getBorderInsets,它指定边框需要自己绘制的空间量。

如果自定义边框具有插图(并且通常具有插图),则您需要同时覆盖AbstractBorder.getBorderInsets(Component c)AbstractBorder.getBorderInsets(Component c,Insets insets)以提供正确的插图。

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

Border API

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

使用 BorderFactory 创建边框

MethodPurpose
Border createLineBorder(Color)

边框 createLineBorder(Color,int)
创建线条边框。第一个参数是java.awt.Color对象,用于指定线条的颜色。可选的第二个参数指定线条的宽度(以像素为单位)。
Border createEtchedBorder()
边框 createEtchedBorder(Color,Color)
Border createEtchedBorder(int)
边框 createEtchedBorder(int,Color,Color)
创建 Eclipse 刻边框。可选的Color参数指定要使用的高光和 shade 颜色。具有int参数的方法允许将 border 方法指定为EtchedBorder.RAISEDEtchedBorder.LOWERED。没有int参数的方法将创建一个降低的 Eclipse 刻边框。
Border createLoweredBevelBorder()创建一个边框,使组件的错觉低于周围区域。
Border createRaisedBevelBorder()创建边框,使组件的错觉高于周围区域。
边框 createBevelBorder(int,Color,Color)
边框 createBevelBorder(int,Color,Color,Color,Color)
创建升高或降低的斜面边框,并指定要使用的颜色。整数参数可以是BevelBorder.RAISEDBevelBorder.LOWERED。使用三参数构造函数,您可以指定高光和 shade 颜色。使用五参数构造函数,可以依次指定外部高光,内部高光,外部 shade 和内部 shade 颜色。
Border createEmptyBorder()
边框 createEmptyBorder(int,int,int,int)
创建不可见的边框。如果不指定任何参数,则边框不占空间,这在创建没有可见边界的带标题的边框时很有用。可选参数指定使用该组件的边框在边框的顶部,左侧,底部和右侧(按 Sequences)占据的像素数。此方法对于在组件周围放置空白空间很有用。
MatteBorder createMatteBorder(int,int,int,int,Color)
MatteBorder createMatteBorder(int,int,int,int,Icon)
创建遮罩边框。整数参数指定边框在使用该边框的任何组件的顶部,左侧,底部和右侧(按此 Sequences)所占据的像素数。 color 参数指定边框应填充其区域的颜色。 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)
创建标题边框。字符串 参数指定要显示的标题。可选的 font 和 color 参数指定用于标题文本的字体和颜色。 border 参数指定应与标题一起显示的边框。如果未指定边框,则使用外观特定的默认边框。
默认情况下,标题跨越其同伴边框的顶部,并向左对齐。可选的整数参数按该 Sequences 指定标题的位置和对齐方式。 TitledBorder定义以下可能的位置:ABOVE_TOPTOP(默认),BELOW_TOPABOVE_BOTTOMBOTTOMBELOW_BOTTOM。您可以将对齐方式指定为LEADING(默认值),CENTERTRAILING。在具有西方字母的语言环境中,LEADING等效于LEFT,而TRAILING等效于RIGHT
CompoundBorder createCompoundBorder(Border,Border)将两个边界合并为一个。第一个参数指定外部边界;第二个是内边界。

设置或获取组件的边框

MethodPurpose
void setBorder(Border)

Border getBorder()
设置或获取接收方JComponent的边界。
void setBorderPainted(boolean)
boolean isBorderPainted()
(在AbstractButtonJMenuBarJPopupMenuJProgressBarJToolBar中)
设置或获取是否应显示组件的边框。

使用边框的示例

本课中的许多示例都使用边框。下表列出了一些有趣的情况。

ExampleWhere DescribedNotes
BorderDemoThis section显示BorderFactory可以创建的每种边框类型的示例。还使用空边框在每个窗格及其内容之间添加呼吸空间。
BoxAlignmentDemo如何使用 BoxLayout使用标题边框。
BoxLayoutDemo如何使用 BoxLayout使用红线显示容器边缘的位置,以便您可以看到盒子布局中多余的空间是如何分布的。
ComboBoxDemo2如何使用组合框使用复合边框将线边框与空边框组合在一起。空边框在线条和组件的内部之间提供了空间。