Java 教程已为 JDK 8 编写。本页面中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
请参阅Java 语言更改以了解 Java SE 9 及后续版本中的更新语言功能的摘要。
请参阅JDK 发行说明以获取有关所有 JDK 发行版的新功能、增强功能以及已删除或弃用选项的信息。
每个JComponent都可以有一个或多个边框。边框是非常有用的对象,它们虽然不是组件本身,但知道如何绘制Swing组件的边缘。边框不仅用于绘制线条和精美的边缘,还可以提供标题和组件周围的空白空间。
我们的示例在JPanel、JLabel和JComponent的自定义子类上设置了边框。尽管从技术上讲,您可以在从JComponent继承的任何对象上设置边框,但许多标准Swing组件的外观和感觉实现与用户设置的边框不兼容。通常情况下,当您想在JPanel或JLabel之外的标准Swing组件上设置边框时,建议将组件放在JPanel中并在JPanel上设置边框。
要在JComponent周围放置边框,可以使用其setBorder方法。您可以使用BorderFactory类创建Swing提供的大多数边框。如果您需要对边框进行引用 - 例如,因为您想在多个组件中使用它 - 您可以将其保存在类型为Border的变量中。下面是创建带边框的容器的代码示例:
JPanel pane = new JPanel(); pane.setBorder(BorderFactory.createLineBorder(Color.black));
下面是一个包含标签组件的容器的图片。由边框绘制的黑色线条标记了容器的边缘。
本页面的其余部分讨论以下主题:
下面的图片显示了一个名为BorderDemo的应用程序,显示了Swing提供的边框。稍后在使用Swing提供的边框中,我们将展示创建这些边框的代码。
点击“启动”按钮,使用Java™ Web Start运行BorderDemo示例(下载JDK 7或更高版本)。或者,要自行编译和运行示例,请参考示例索引。
下图显示了一些亚光边框。创建亚光边框时,您需要指定组件的顶部、左侧、底部和右侧各占据多少像素。然后,您可以指定亚光边框要绘制的颜色或图标。在选择图标和确定组件大小时需要小心,否则图标可能会被截断或在组件的角落上不匹配。
下图显示了带标题的边框。使用标题边框,您可以将任何边框转换为显示文本描述的边框。如果您不指定边框,则使用特定于外观的边框。例如,Java外观中的默认标题边框使用灰线,Windows外观中的默认标题边框使用蚀刻边框。默认情况下,标题横跨边框的左上角,如下图顶部所示。
下图显示了复合边框。使用复合边框,您可以组合任何两个边框,这两个边框本身可以是复合边框。
下面的代码示例显示了如何创建和设置前面图中显示的边框。您可以在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接口外,边框包还包含实现您已经见过的边框的类:LineBorder、EtchedBorder、BevelBorder、EmptyBorder、MatteBorder、TitledBorder和CompoundBorder。边框包还包含一个名为SoftBevelBorder的类,它产生与BevelBorder类似但边缘更柔和的效果。
如果没有适合的Swing边框,您可以实现自己的边框。通常,您可以通过创建AbstractBorder类的子类来实现这一点。在子类中,您必须实现至少一个构造函数和以下两个方法:
paintBorder,其中包含JComponent执行以绘制边框的绘图代码。getBorderInsets,用于指定边框绘制所需的空间量。如果自定义边框有内边距(它们通常有内边距),您需要覆盖AbstractBorder.getBorderInsets(Component c)和AbstractBorder.getBorderInsets(Component c, Insets insets)两个方法以提供正确的内边距。
有关实现边框的示例,请参阅javax.swing.border包中类的源代码。
以下表格列出了常用的边框方法。使用边框的 API 分为两类:
使用BorderFactory创建边框Border createLineBorder(Color)java.awt.ColorBorder createEtchedBorder()
ColorintEtchedBorder.RAISEDEtchedBorder.LOWEREDintBorder createLoweredBevelBorder()Border createRaisedBevelBorder()
BevelBorder.RAISEDBevelBorder.LOWEREDcreateEmptyBorder()方法
默认情况下,标题跨越其伴随边框的顶部并左对齐。可选的整数参数按顺序指定标题的位置和对齐方式。TitledBorder定义了以下可能的位置:ABOVE_TOP,TOP(默认),BELOW_TOP,ABOVE_BOTTOM,BOTTOM和BELOW_BOTTOM。您可以将对齐方式指定为LEADING(默认),CENTER或TRAILING。在使用西方字母表的语言环境中,LEADING相当于LEFT,TRAILING相当于RIGHT。
| 方法 | 目的 |
|---|---|
| void setBorder(Border) Border getBorder() |
设置或获取接收到的JComponent的边框。 |
| void setBorderPainted(boolean) boolean isBorderPainted() (在 AbstractButton,JMenuBar,JPopupMenu,JProgressBar和JToolBar中) |
设置或获取组件的边框是否显示。 |
本课程中的许多示例都使用边框。以下表格列出了一些有趣的案例。
| 示例 | 描述位置 | 备注 |
|---|---|---|
BorderDemo |
本节 | 显示了BorderFactory可以创建的每种类型的边框示例。还使用了空边框在每个窗格和其内容之间添加间隔。 |
BoxAlignmentDemo |
使用BoxLayout | 使用了标题边框。 |
BoxLayoutDemo |
使用BoxLayout | 使用红线显示容器的边缘位置,以便您可以看到盒子布局中的额外空间如何分配。 |
ComboBoxDemo2 |
使用组合框 | 使用复合边框将线边框与空边框组合。空边框提供了线和组件内部之间的间隔。 |