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.Color
Border createEtchedBorder()
Color
int
EtchedBorder.RAISED
EtchedBorder.LOWERED
int
Border createLoweredBevelBorder()Border createRaisedBevelBorder()
BevelBorder.RAISED
BevelBorder.LOWERED
createEmptyBorder()方法
默认情况下,标题跨越其伴随边框的顶部并左对齐。可选的整数参数按顺序指定标题的位置和对齐方式。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 |
使用组合框 | 使用复合边框将线边框与空边框组合。空边框提供了线和组件内部之间的间隔。 |