Java 中文官方教程 2022 版(二十二)(1)https://developer.aliyun.com/article/1486762
修复对齐问题
有时候BoxLayout
会出现两种类型的对齐问题:
- 一组组件都具有相同的对齐方式,但你想要改变它们的对齐方式以使它们看起来更好。例如,你可能希望一组从左到右的按钮的底部对齐,而不是它们的中心对齐。以下是一个示例:
- 由
BoxLayout
控制的两个或更多组件具有不同的默认对齐方式,导致它们对齐不正确。例如,如下所示,如果一个标签和一个面板在一个从上到下的盒式布局中,标签的左边缘默认与面板的中心对齐。
一般来说,由从上到下的BoxLayout
对象控制的所有组件应该具有相同的 X 对齐方式。同样,由从左到右的BoxLayout
控制的所有组件通常应该具有相同的 Y 对齐方式。你可以通过调用其setAlignmentX
方法来设置JComponent
的 X 对齐方式。所有组件都可以选择的另一种方法是在组件类的自定义子类中覆盖getAlignmentX
方法。类似地,你可以通过调用setAlignmentY
方法或覆盖getAlignmentY
来设置组件的 Y 对齐方式。
这里有一个示例,取自一个名为BoxAlignmentDemo
的应用程序,将两个按钮的 Y 对齐方式更改为底部对齐:
button1.setAlignmentY(Component.BOTTOM_ALIGNMENT); button2.setAlignmentY(Component.BOTTOM_ALIGNMENT);
点击“启动”按钮以使用Java™ Web Start运行 BoxAlignmentDemo(下载 JDK 7 或更高版本)。或者,要自行编译和运行示例,请参考示例索引。
默认情况下,大多数组件都具有中心 X 和 Y 对齐。然而,按钮、组合框、标签和菜单项具有不同的默认 X 对齐值:LEFT_ALIGNMENT
。前面的图片展示了如果将一个左对齐的组件(如标签)与一个在由上至下控制的容器中的中心对齐组件放在一起会发生什么。
BoxAlignmentDemo
程序提供了修复不匹配对齐问题的示例。通常,只需将有问题的按钮或标签设置为中心对齐即可。例如:
label.setAlignmentX(Component.CENTER_ALIGNMENT);
指定组件尺寸
正如之前提到的,BoxLayout
会关注组件的请求的最小、首选和最大尺寸。在微调布局时,你可能需要调整这些尺寸。
有时需要调整尺寸是显而易见的。例如,按钮的最大尺寸通常与其首选尺寸相同。如果希望在有额外空间时将按钮绘制得更宽,那么需要更改其最大尺寸。
然而,有时需要调整尺寸并不那么明显。你可能会在框布局中得到意想不到的结果,而不知道原因。在这种情况下,通常最好首先将问题视为对齐问题。如果调整对齐方式没有帮助,那么可能存在尺寸问题。我们稍后会进一步讨论这个问题。
注意: 虽然BoxLayout
会关注组件的最大尺寸,但许多布局管理器不会。例如,如果你将一个按钮放在BorderLayout
的底部,那么按钮的宽度可能会超过其首选宽度,无论按钮的最大尺寸是多少。另一方面,BoxLayout
永远不会使按钮的宽度超过其最大尺寸。
你可以通过两种方式更改最小、首选和最大尺寸:
- 通过调用适当的
set*Xxx*Size
方法(由JComponent
类定义)。例如:
comp.setMinimumSize(new Dimension(50, 25)); comp.setPreferredSize(new Dimension(50, 25)); comp.setMaximumSize(new Dimension(Short.MAX_VALUE, Short.MAX_VALUE));
- 通过覆盖适当的
get*Xxx*Size
方法。例如:
*...//in a subclass of a component class:* public Dimension getMaximumSize() { size = getPreferredSize(); size.width = Short.MAX_VALUE; return size; }
如果你在使用框布局时遇到问题,并且已经排除了对齐问题,那么问题很可能与尺寸有关。例如,如果由框布局控制的容器占用了太多空间,那么容器中的一个或多个组件可能需要限制其最大尺寸。
您可以使用两种技术来追踪箱式布局中的尺寸问题:
- 在问题的 Swing 组件外部添加花哨的线条边框。这样你就可以看到它们的真实大小。例如:
comp.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createLineBorder(Color.red), comp.getBorder()));
- 使用
System.out.println
来打印组件的最小、首选和最大尺寸,也许还有它们的边界。
Box 布局 API
以下表格列出了常用的BoxLayout
和Box
构造函数和方法。使用箱式布局的 API 分为以下几类:
- 创建
BoxLayout
对象 - 创建空间填充器
- 其他有用的方法
创建BoxLayout
对象
构造函数或方法 | 目的 |
BoxLayout(Container, int) |
创建一个控制指定Container 的BoxLayout 实例。整数参数指定容器的组件应该沿着哪个轴布局。当容器具有默认组件方向时,BoxLayout.LINE_AXIS 指定组件从左到右布局,BoxLayout.PAGE_AXIS 指定组件从上到下布局。 |
Box(int) |
创建一个Box - 使用指定轴的BoxLayout 的容器。 |
static Box createHorizontalBox() (在Box 中) |
创建一个从左到右布局其组件的Box 。 |
static Box createVerticalBox() (在Box 中) |
创建一个从上到下布局其组件的Box 。 |
创建空间填充器
这些方法在Box
类中定义。
构造函数或方法 | 目的 |
Component createRigidArea(Dimension) |
创建一个刚性组件。 |
| Component createHorizontalGlue() Component createVerticalGlue()
| Component createGlue()
| 创建一个粘合剂组件。水平粘合剂和垂直粘合剂非常有用。 |
Component createHorizontalStrut() Component createVerticalStrut() |
创建一个“支柱”组件。我们建议使用刚性区域而不是支柱。 |
Box.Filler(Dimension, Dimension, Dimension) |
创建一个具有指定最小、首选和最大尺寸的组件(参数按照指定顺序提供)。有关详细信息,请参阅本节前面的自定义Box.Filler 讨论。 |
其他有用的方法
方法 | 目的 |
void changeShape(Dimension, Dimension, Dimension) (在Box.Filler 中) |
更改接收者Box.Filler 对象的最小、首选和最大尺寸。布局会相应更改。 |
使用 Box 布局的示例
以下表格列出了使用箱式布局的许多示例。
示例 | 描述位置 | 注释 |
BoxLayoutDemo2 | 本页 | 使用箱式布局创建一个居中的列组件。 |
BoxAlignmentDemo | 本页 | 演示如何解决常见的对齐问题。 |
BoxLayoutDemo | 本页面 | 让您尝试对齐和最大尺寸。 |
ListDialog | 本页面 | 一个简单但逼真的例子,展示了如何同时使用自顶向下箱式布局和左右箱式布局。使用水平粘合剂、刚性区域和空边框。还设置了组件的 X 对齐方式。 |
InternalFrameEventDemo | 如何编写内部框架监听器 | 使用自顶向下布局来将按钮和滚动窗格居中放置在内部框架中。 |
MenuGlueDemo | 自定义菜单布局 | 展示如何使用粘合组件将菜单右对齐在菜单栏中。 |
MenuLayoutDemo | 自定义菜单布局 | 展示如何通过将菜单栏更改为使用自顶向下的箱式布局,以及上下文菜单更改为使用左右的箱式布局来自定义菜单布局。 |
ConversionPanel.java 在 Converter 演示中 |
如何使用面板 | 通过将组件的宽度设置为相同,以及它们容器的宽度设置为相同,来在不同的箱式布局控制容器中对齐两个组件。 |
如何使用 CardLayout
注意: 本课程涵盖手动编写布局代码,这可能具有挑战性。如果您对学习布局管理的所有细节不感兴趣,您可能更喜欢使用GroupLayout
布局管理器结合构建工具来布局您的 GUI。其中一个构建工具是 NetBeans IDE。否则,如果您想手动编码而不想使用GroupLayout
,那么建议使用GridBagLayout
作为下一个最灵活和强大的布局管理器。
如果您有兴趣使用 JavaFX 创建 GUI,请参阅JavaFX 中的布局。
以下图表示一个应用程序的快照,该应用程序使用CardLayout
类在两个面板之间切换。
点击“启动”按钮以使用Java™ Web Start运行 CardLayoutDemo(下载 Java SE)。或者,要自行编译和运行示例,请参考示例索引。
这个演示的完整代码在CardLayoutDemo.java
文件中。
CardLayout
类管理两个或多个组件(通常是JPanel
实例),它们共享相同的显示空间。使用CardLayout
类时,让用户通过使用组合框在组件之间进行选择。CardLayoutDemo
应用程序是一个示例,用于说明此功能。
另一种完成相同任务的方法是使用选项卡窗格。下图显示了前面示例的选项卡窗格版本:
因为选项卡窗格提供了自己的 GUI,所以使用选项卡窗格比使用CardLayout
类更简单。例如,使用选项卡窗格实现前面的示例会导致代码行数更少的程序。
单击“启动”按钮以使用Java™ Web Start运行 TabDemo(下载 JDK 7 或更高版本)。或者,要自行编译和运行示例,请参考示例索引。
此演示的完整代码位于TabDemo.java
文件中。
从概念上讲,CardLayout
管理的每个组件都像一叠扑克牌或交换卡片,任何时候只有顶部卡片可见。您可以通过以下任何方式选择显示的卡片:
- 通过请求第一张或最后一张卡片,按照添加到容器的顺序
- 通过向前或向后翻转卡片堆栈来选择卡片。
- 通过指定具有特定名称的卡片
CardLayoutDemo
类使用最后一种方案。
来自CardLayoutDemo.java
应用程序的以下代码片段创建了CardLayout
对象及其管理的组件。
*//Where instance variables are declared:* JPanel cards; final static String BUTTONPANEL = "Card with JButtons"; final static String TEXTPANEL = "Card with JTextField"; *//Where the components controlled by the CardLayout are initialized:* //Create the "cards". JPanel card1 = new JPanel(); ... JPanel card2 = new JPanel(); ... //Create the panel that contains the "cards". cards = new JPanel(new CardLayout()); cards.add(card1, BUTTONPANEL); cards.add(card2, TEXTPANEL);
要将组件添加到CardLayout
对象管理的容器中,请指定一个标识要添加的组件的字符串。例如,在此演示中,第一个面板的字符串是"Card with JButtons"
,第二个面板的字符串是"Card with JTextField"
。在此演示中,这些字符串也在组合框中使用。
要选择CardLayout
对象显示的组件,请在您的代码示例中添加额外的代码:
*//Where the GUI is assembled:* //Put the JComboBox in a JPanel to get a nicer look. JPanel comboBoxPane = new JPanel(); //use FlowLayout String comboBoxItems[] = { BUTTONPANEL, TEXTPANEL }; JComboBox cb = new JComboBox(comboBoxItems); cb.setEditable(false); cb.addItemListener(this); comboBoxPane.add(cb); ... pane.add(comboBoxPane, BorderLayout.PAGE_START); pane.add(cards, BorderLayout.CENTER); ... //Method came from the ItemListener class implementation, //contains functionality to process the combo box item selecting public void itemStateChanged(ItemEvent evt) { CardLayout cl = (CardLayout)(cards.getLayout()); cl.show(cards, (String)evt.getItem()); }
此示例显示,要使用CardLayout
类的show
方法,必须设置当前可见的组件。show
方法中的第一个参数是CardLayout
控制的容器,即CardLayout
管理的组件的容器。第二个参数是标识要显示的组件的字符串。这个字符串与将组件添加到容器时使用的字符串相同。
CardLayout API
以下表格列出了用于选择组件的CardLayout
类方法。对于每个方法,第一个参数是CardLayout
是布局管理器的容器(CardLayout
控制的卡片的容器)。
方法 | 目的 |
first (Container *parent*) |
翻转到容器的第一张卡片。 |
next (Container *parent*) |
翻转到容器的下一张卡片。如果当前可见的卡片是最后一张,则此方法将翻转到布局中的第一张卡片。 |
previous (Container *parent*) |
翻转到容器的上一张卡片。如果当前可见的卡片是第一张,则此方法将翻转到布局中的最后一张卡片。 |
last (Container *parent*) |
翻转到容器的最后一张卡片。 |
show (Container *parent*, String *name*) |
使用指定的 name 使用 addLayoutComponent 方法添加到此布局中的组件进行翻转。 |
使用 CardLayout 的示例
在这个教程中,只有一个示例使用了 CardLayout
,即 CardLayoutDemo
。一般来说,我们的示例使用 选项卡面板 而不是 CardLayout
,因为选项卡面板提供了自己的 GUI。
如何使用流式布局
注意: 本课程涵盖了手动编写布局代码,这可能具有挑战性。如果您不想学习布局管理的所有细节,您可能更喜欢使用GroupLayout
布局管理器结合构建工具来布局您的 GUI。其中一个构建工具是 NetBeans IDE。否则,如果您想手动编码而不想使用GroupLayout
,那么推荐使用GridBagLayout
作为下一个最灵活和强大的布局管理器。
如果您有兴趣使用 JavaFX 创建 GUI,请参阅JavaFX 中的布局。
FlowLayout
类提供了一个非常简单的布局管理器,默认情况下由JPanel
对象使用。以下图表示使用流式布局的应用程序的快照:
单击“启动”按钮以使用Java™ Web Start运行FlowLayoutDemo
(下载 JDK 7 或更高版本)。或者,要自行编译和运行示例,请参考示例索引。
此演示的完整代码位于FlowLayoutDemo.java
文件中。
FlowLayout
类将组件放在一行中,大小为它们的首选大小。如果容器中的水平空间太小,无法将所有组件放在一行中,FlowLayout
类将使用多行。如果容器比一行组件所需的宽度更宽,则默认情况下,该行在容器内水平居中。要指定行是左对齐还是右对齐,请使用带有对齐参数的FlowLayout
构造函数。FlowLayout
类的另一个构造函数指定在组件周围放置多少垂直或水平填充。
下面的代码片段创建了一个FlowLayout
对象和它管理的组件。
FlowLayout experimentLayout = new FlowLayout(); ... compsToExperiment.setLayout(experimentLayout); compsToExperiment.add(new JButton("Button 1")); compsToExperiment.add(new JButton("Button 2")); compsToExperiment.add(new JButton("Button 3")); compsToExperiment.add(new JButton("Long-Named Button 4")); compsToExperiment.add(new JButton("5"));
选择“从左到右”或“从右到左”选项,并单击“应用方向”按钮以设置组件的方向。以下代码片段将“从左到右”组件方向应用于experimentLayout
。
compsToExperiment.setComponentOrientation( ComponentOrientation.LEFT_TO_RIGHT);
流式布局 API
以下表列出了FlowLayout
类的构造函数。
构造函数 | 目的 |
FlowLayout() |
构造一个具有居中对齐和水平垂直间隙的默认大小为5 像素 的新FlowLayout 对象。 |
FlowLayout(int *align*) |
创建一个新的流式布局管理器,具有指定的对齐方式和水平垂直间隙,默认大小为5 像素 。对齐参数可以是FlowLayout.LEADING ,FlowLayout.CENTER 或FlowLayout.TRAILING 。当FlowLayout 对象控制具有从左到右组件方向(默认)的容器时,LEADING 值指定左对齐的组件,TRAILING 值指定右对齐的组件。 |
FlowLayout (int *align*, int *hgap*, int *vgap*) |
创建一个新的流式布局管理器,具有指定的对齐方式和指定的水平和垂直间隙。hgap 和vgap 参数指定组件之间要放置的像素数。 |
使用 FlowLayout 的示例
以下表格列出了使用FlowLayout
类的代码示例,并提供到相关部分的链接。
示例 | 描述位置 | 备注 |
FlowLayoutDemo |
本页 | 设置内容窗格使用FlowLayout 。如果将RIGHT_TO_LEFT 常量设置为true 并重新编译,您可以看到FlowLayout 如何处理具有从右到左组件方向的容器。 |
CardLayoutDemo |
如何使用 CardLayout | 在BorderLayout 的顶部部分很好地居中一个组件,并将组件放在使用FlowLayout 的JPanel 中。 |
ButtonDemo |
如何使用按钮、复选框和单选按钮 | 使用JPanel 的默认FlowLayout 。 |
TextInputDemo |
如何使用格式化文本字段 | 使用一个右对齐的FlowLayout 呈现两个按钮的面板。 |
如何使用 GridBagLayout
原文:
docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html
注意: 本课程涵盖了手动编写布局代码,这可能具有挑战性。如果您对学习布局管理的所有细节不感兴趣,您可能更喜欢使用 GroupLayout
布局管理器结合构建工具来布局您的 GUI。其中一个构建工具是 NetBeans IDE。否则,如果您想手动编写代码而不想使用 GroupLayout
,那么推荐使用 GridBagLayout
作为下一个最灵活和强大的布局管理器。
如果您有兴趣使用 JavaFX 创建您的 GUI,请参阅 JavaFX 中的布局。
这是一个使用 GridBagLayout
的示例图片。
点击“启动”按钮以使用 Java™ Web Start 运行 GridBagLayoutDemo(下载 JDK 7 或更高版本)。或者,要自行编译和运行示例,请参考 示例索引。
GridBagDemo
的代码位于 GridBagLayoutDemo.java
中。
GridBagLayout
是 Java 平台提供的最灵活 — 也是最复杂 — 布局管理器之一。GridBagLayout
将组件放置在行和列的网格中,允许指定的组件跨越多行或多列。并非所有行都必须具有相同的高度。同样,并非所有列都必须具有相同的宽度。基本上,GridBagLayout
将组件放置在网格中的矩形(单元格)中,然后使用组件的首选大小来确定单元格的大小。
以下图显示了前面小程序的网格。您可以看到,网格有三行三列。第二行的按钮跨越所有列;第三行的按钮跨越了右侧两列。
如果您按照下图所示放大窗口,您会注意到包含按钮 5 的底部行获得了所有新的垂直空间。新的水平空间均匀分配给所有列。此调整大小行为基于程序为GridBagLayout
中的各个组件分配的权重。您还会注意到每个组件占用所有可用的水平空间 — 但不占用所有可用的垂直空间(正如您可以看到的按钮 5)。此行为也由程序指定。
程序指定其组件的大小和位置特征的方式是为每个组件指定约束条件。在组件上设置约束的首选方法是使用Container.add
变体,传递一个GridBagConstraints
对象,如下一节所示。
以下各节解释了您可以设置的约束条件并提供了示例。
指定约束条件
以下代码是典型的使用GridBagLayout
的容器中的内容。您将在下一节看到更详细的示例。
JPanel pane = new JPanel(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); *//For each component to be added to this container:* *//...Create the component...* *//...Set instance variables in the GridBagConstraints instance...* pane.add(theComponent, c);
正如您可能从上面的示例中猜到的那样,即使组件具有不同的约束条件,也可以重用相同的GridBagConstraints
实例。但是,建议您不要重用GridBagConstraints
,因为如果您忘记为每个新实例重置字段,这很容易导致引入细微的错误。
**注意:**以下讨论假定GridBagLayout
控制具有从左到右组件方向的容器。
您可以设置以下GridBagConstraints
实例变量:
gridx
,gridy
指定组件左上角的行和列。最左侧的列地址为gridx=0
,最顶部的行地址为gridy=0
。使用GridBagConstraints.RELATIVE
(默认值)指定组件放置在刚刚在此组件之前添加到容器的组件的右侧(对于gridx
)或下方(对于gridy
)。我们建议为每个组件指定gridx
和gridy
值,而不仅仅使用GridBagConstraints.RELATIVE
;这样往往会产生更可预测的布局。
gridwidth
,gridheight
指定组件显示区域中的列数(对于gridwidth
)或行数(对于gridheight
)。这些约束指定组件使用的单元格数,而不是它使用的像素数。默认值为 1。使用GridBagConstraints.REMAINDER
指定组件为其行(对于gridwidth
)或列(对于gridheight
)中的最后一个。使用GridBagConstraints.RELATIVE
指定组件为其行(对于gridwidth
)或列(对于gridheight
)中的倒数第二个。我们建议为每个组件指定gridwidth
和gridheight
值,而不仅仅使用GridBagConstraints.RELATIVE
和GridBagConstraints.REMAINDER
;这样往往会产生更可预测的布局。
注意: GridBagLayout
不允许组件跨越多行,除非组件位于最左侧列,或者您已为组件指定了正值的gridx
和gridy
值。
fill
当组件的显示区域大于组件请求的大小时使用,以确定是否以及如何调整组件的大小。有效值(定义为GridBagConstraints
常量)包括NONE
(默认值),HORIZONTAL
(使组件足够宽以水平填充其显示区域,但不更改其高度),VERTICAL
(使组件足够高以垂直填充其显示区域,但不更改其宽度)和BOTH
(使组件完全填充其显示区域)。
ipadx
,ipady
指定内部填充:需要添加到组件大小的量。默认值为零。组件的宽度至少为其最小宽度加上ipadx*2
像素,因为填充应用于组件的两侧。同样,组件的高度至少为其最小高度加上ipady*2
像素。
insets
指定组件的外部填充–组件与其显示区域边缘之间的最小空间量。该值被指定为一个Insets
对象。默认情况下,每个组件都没有外部填充。
anchor
当组件比其显示区域小时使用,以确定在区域内的哪个位置放置组件。有效值(定义为GridBagConstraints
常量)为CENTER
(默认值),PAGE_START
,PAGE_END
,LINE_START
,LINE_END
,FIRST_LINE_START
,FIRST_LINE_END
,LAST_LINE_END
和LAST_LINE_START
。
这里是一个容器中这些值在默认的从左到右的组件方向中如何解释的图片。
FIRST_LINE_START | PAGE_START | FIRST_LINE_END |
LINE_START | CENTER | LINE_END |
LAST_LINE_START | PAGE_END | LAST_LINE_END |
版本说明: PAGE_*
和 *LINE_*
常量是在 1.4 版本中引入的。之前的版本需要使用指向罗盘方向的常量。例如,NORTHEAST
表示显示区域的右上部分。我们建议您使用新的常量,因为它们更容易本地化。
weightx
,weighty
指定权重是一门艺术,可以对 GridBagLayout
控制的组件的外观产生重大影响。权重用于确定如何在列之间(weightx
)和行之间(weighty
)分配空间;这对于指定调整大小行为很重要。
除非您至少为 weightx
或 weighty
指定一个非零值,否则所有组件都会聚集在容器的中心。这是因为当权重为 0.0(默认值)时,GridBagLayout
将任何额外的空间放在其单元格网格和容器边缘之间。
通常,权重用 0.0 和 1.0 来指定极端值:中间的数字根据需要使用。较大的数字表示组件的行或列应该获得更多的空间。对于每一列,权重与该列中指定的最高 weightx
相关,每个多列组件的权重在组件所在的列之间以某种方式分配。同样,每一行的权重与该行中指定的最高 weighty
相关。额外的空间倾向于分配给最右边的列和底部的行。
下一节将深入讨论约束条件,以解释示例程序的工作原理。
示例解释
这里,再次展示了 GridBagLayoutDemo 应用程序的图片。
点击“启动”按钮以使用 Java™ Web Start 运行 GridBagLayoutDemo(下载 JDK 7 或更高版本)。或者,要自行编译和运行示例,请参考示例索引。
以下代码创建了 GridBagLayout
和它管理的组件。您可以在 GridBagLayoutDemo.java
中找到整个源文件。
JButton button; pane.setLayout(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); if (shouldFill) { //natural height, maximum width c.fill = GridBagConstraints.HORIZONTAL; } button = new JButton("Button 1"); if (shouldWeightX) { c.weightx = 0.5; } c.fill = GridBagConstraints.HORIZONTAL; c.gridx = 0; c.gridy = 0; pane.add(button, c); button = new JButton("Button 2"); c.fill = GridBagConstraints.HORIZONTAL; c.weightx = 0.5; c.gridx = 1; c.gridy = 0; pane.add(button, c); button = new JButton("Button 3"); c.fill = GridBagConstraints.HORIZONTAL; c.weightx = 0.5; c.gridx = 2; c.gridy = 0; pane.add(button, c); button = new JButton("Long-Named Button 4"); c.fill = GridBagConstraints.HORIZONTAL; c.ipady = 40; //make this component tall c.weightx = 0.0; c.gridwidth = 3; c.gridx = 0; c.gridy = 1; pane.add(button, c); button = new JButton("5"); c.fill = GridBagConstraints.HORIZONTAL; c.ipady = 0; //reset to default c.weighty = 1.0; //request any extra vertical space c.anchor = GridBagConstraints.PAGE_END; //bottom of space c.insets = new Insets(10,0,0,0); //top padding c.gridx = 1; //aligned with button 2 c.gridwidth = 2; //2 columns wide c.gridy = 2; //third row pane.add(button, c);
此示例对GridBagLayout
管理的所有组件使用一个GridBagConstraints
实例,但在实际情况中,建议不要重用GridBagConstraints
,因为如果忘记为每个新实例重置字段,很容易引入细微错误。在将每个组件添加到容器之前,代码设置(或重置为默认值)GridBagConstraints
对象中的适当实例变量。然后将组件添加到其容器,将GridBagConstraints
对象指定为add
方法的第二个参数。
例如,要使按钮 4 变得特别高,示例中有这段代码:
c.ipady = 40;
在设置下一个组件的约束之前,代码将ipady
的值重置为默认值:
c.ipady = 0;
如果组件的显示区域大于组件本身,则可以使用GridBagConstraints.anchor
约束指定组件在显示区域中的显示位置。anchor
约束的值可以是绝对的(北、南、东、西等),也可以是相对于方向的(在页面的开始、在行的末尾、在第一行的开始等),或者相对于组件的基线。有关anchor
约束的可能值的完整列表,包括基线相关值,请参阅GridBagConstraints.anchor
的 API 文档。您可以在上面的代码片段中看到,按钮 5 指定应在显示区域的末尾显示,通过设置GridBagConstraints.PAGE_END
作为锚点。
注意: 教程的示例以不同的方式指定约束对象,您可能在其他程序中也会看到。我们的示例以前是通过在GridBagLayout
对象上调用setConstraints
方法来指定约束。例如:
GridBagLayout gridbag = new GridBagLayout(); pane.setLayout(gridbag); ... gridbag.setConstraints(button, c); pane.add(button);
Java 中文官方教程 2022 版(二十二)(3)https://developer.aliyun.com/article/1486765