Java 中文官方教程 2022 版(二十二)(2)

简介: Java 中文官方教程 2022 版(二十二)

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

以下表格列出了常用的BoxLayoutBox构造函数和方法。使用箱式布局的 API 分为以下几类:

  • 创建BoxLayout对象
  • 创建空间填充器
  • 其他有用的方法

创建BoxLayout对象

构造函数或方法 目的
BoxLayout(Container, int) 创建一个控制指定ContainerBoxLayout实例。整数参数指定容器的组件应该沿着哪个轴布局。当容器具有默认组件方向时,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

原文:docs.oracle.com/javase/tutorial/uiswing/layout/card.html


注意: 本课程涵盖手动编写布局代码,这可能具有挑战性。如果您对学习布局管理的所有细节不感兴趣,您可能更喜欢使用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。

如何使用流式布局

原文:docs.oracle.com/javase/tutorial/uiswing/layout/flow.html


注意: 本课程涵盖了手动编写布局代码,这可能具有挑战性。如果您不想学习布局管理的所有细节,您可能更喜欢使用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.LEADINGFlowLayout.CENTERFlowLayout.TRAILING。当FlowLayout对象控制具有从左到右组件方向(默认)的容器时,LEADING值指定左对齐的组件,TRAILING值指定右对齐的组件。
FlowLayout (int *align*, int *hgap*, int *vgap*) 创建一个新的流式布局管理器,具有指定的对齐方式和指定的水平和垂直间隙。hgapvgap参数指定组件之间要放置的像素数。

使用 FlowLayout 的示例

以下表格列出了使用FlowLayout类的代码示例,并提供到相关部分的链接。

示例 描述位置 备注
FlowLayoutDemo 本页 设置内容窗格使用FlowLayout。如果将RIGHT_TO_LEFT常量设置为true并重新编译,您可以看到FlowLayout如何处理具有从右到左组件方向的容器。
CardLayoutDemo 如何使用 CardLayout BorderLayout的顶部部分很好地居中一个组件,并将组件放在使用FlowLayoutJPanel中。
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实例变量:

gridxgridy

指定组件左上角的行和列。最左侧的列地址为gridx=0,最顶部的行地址为gridy=0。使用GridBagConstraints.RELATIVE(默认值)指定组件放置在刚刚在此组件之前添加到容器的组件的右侧(对于gridx)或下方(对于gridy)。我们建议为每个组件指定gridxgridy值,而不仅仅使用GridBagConstraints.RELATIVE;这样往往会产生更可预测的布局。

gridwidthgridheight

指定组件显示区域中的列数(对于gridwidth)或行数(对于gridheight)。这些约束指定组件使用的单元格数,而不是它使用的像素数。默认值为 1。使用GridBagConstraints.REMAINDER指定组件为其行(对于gridwidth)或列(对于gridheight)中的最后一个。使用GridBagConstraints.RELATIVE指定组件为其行(对于gridwidth)或列(对于gridheight)中的倒数第二个。我们建议为每个组件指定gridwidthgridheight值,而不仅仅使用GridBagConstraints.RELATIVEGridBagConstraints.REMAINDER;这样往往会产生更可预测的布局。

注意: GridBagLayout不允许组件跨越多行,除非组件位于最左侧列,或者您已为组件指定了正值的gridxgridy值。

fill

当组件的显示区域大于组件请求的大小时使用,以确定是否以及如何调整组件的大小。有效值(定义为GridBagConstraints常量)包括NONE(默认值),HORIZONTAL(使组件足够宽以水平填充其显示区域,但不更改其高度),VERTICAL(使组件足够高以垂直填充其显示区域,但不更改其宽度)和BOTH(使组件完全填充其显示区域)。

ipadxipady

指定内部填充:需要添加到组件大小的量。默认值为零。组件的宽度至少为其最小宽度加上ipadx*2像素,因为填充应用于组件的两侧。同样,组件的高度至少为其最小高度加上ipady*2像素。

insets

指定组件的外部填充–组件与其显示区域边缘之间的最小空间量。该值被指定为一个Insets对象。默认情况下,每个组件都没有外部填充。

anchor

当组件比其显示区域小时使用,以确定在区域内的哪个位置放置组件。有效值(定义为GridBagConstraints常量)为CENTER(默认值),PAGE_STARTPAGE_ENDLINE_STARTLINE_ENDFIRST_LINE_STARTFIRST_LINE_ENDLAST_LINE_ENDLAST_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 表示显示区域的右上部分。我们建议您使用新的常量,因为它们更容易本地化。


weightxweighty

指定权重是一门艺术,可以对 GridBagLayout 控制的组件的外观产生重大影响。权重用于确定如何在列之间(weightx)和行之间(weighty)分配空间;这对于指定调整大小行为很重要。

除非您至少为 weightxweighty 指定一个非零值,否则所有组件都会聚集在容器的中心。这是因为当权重为 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

相关文章
|
1月前
|
Java 开发者 UED
【实战宝典】Java异常处理大师级教程:throws关键字,让异常声明成为你的专属标签!
【实战宝典】Java异常处理大师级教程:throws关键字,让异常声明成为你的专属标签!
40 3
|
10天前
|
Java API
Java时间戳教程
本文详细介绍Java中时间戳的处理方法,包括获取当前时间戳、使用`java.time`包、时间戳与日期的相互转换及格式化等。示例代码展示了如何利用`System.currentTimeMillis()`和`java.time.Instant`获取时间戳,以及如何通过`Date`和`ZonedDateTime`进行日期转换和时区处理。随着Java 8引入的`java.time`包,日期时间操作变得更加强大和便捷,推荐在新项目中优先采用。
|
1月前
|
前端开发 Java Maven
【前端学java】全网最详细的maven安装与IDEA集成教程!
【8月更文挑战第12天】全网最详细的maven安装与IDEA集成教程!
69 2
【前端学java】全网最详细的maven安装与IDEA集成教程!
|
1月前
|
Java 开发者
Java多线程教程:使用ReentrantLock实现高级锁功能
Java多线程教程:使用ReentrantLock实现高级锁功能
30 1
|
1月前
|
存储 网络协议 Oracle
java教程
java教程【8月更文挑战第11天】
25 5
|
2月前
|
SQL 安全 Java
「滚雪球学Java」教程导航帖(更新2024.07.16)
《滚雪球学Spring Boot》是一个面向初学者的Spring Boot教程,旨在帮助读者快速入门Spring Boot开发。本专通过深入浅出的方式,将Spring Boot开发中的核心概念、基础知识、实战技巧等内容系统地讲解,同时还提供了大量实际的案例,让读者能够快速掌握实用的Spring Boot开发技能。本书的特点在于注重实践,通过实例学习的方式激发读者的学习兴趣和动力,并引导读者逐步掌握Spring Boot开发的实际应用。
73 1
「滚雪球学Java」教程导航帖(更新2024.07.16)
|
1月前
|
Java API
Java与Lua互相调用简单教程
【8月更文挑战第29天】在软件开发中,Java以其强大的稳定性和广泛的生态系统著称,而Lua则因其轻量级、灵活和嵌入式的特点在脚本编写、游戏开发等领域大放异彩。将两者结合使用,可以充分利用Java的底层能力和Lua的快速开发优势。本文将通过一个简单的教程,介绍如何在Java程序中嵌入并执行Lua脚本,以及如何在Lua中调用Java方法。
26 0
WXM
|
2月前
|
Oracle Java 关系型数据库
Java JDK下载安装及环境配置超详细图文教程
Java JDK下载安装及环境配置超详细图文教程
WXM
298 3
|
2月前
|
测试技术 API Android开发
《手把手教你》系列基础篇(九十七)-java+ selenium自动化测试-框架设计篇-Selenium方法的二次封装和页面基类(详解教程)
【7月更文挑战第15天】这是关于自动化测试框架中Selenium API二次封装的教程总结。教程中介绍了如何设计一个支持不同浏览器测试的页面基类(BasePage),该基类包含了对Selenium方法的二次封装,如元素的输入、点击、清除等常用操作,以减少重复代码。此外,页面基类还提供了获取页面标题和URL的方法。
73 2
|
2月前
|
Web App开发 XML Java
《手把手教你》系列基础篇(九十六)-java+ selenium自动化测试-框架之设计篇-跨浏览器(详解教程)
【7月更文挑战第14天】这篇教程介绍了如何使用Java和Selenium构建一个支持跨浏览器测试的自动化测试框架。设计的核心是通过读取配置文件来切换不同浏览器执行测试用例。配置文件中定义了浏览器类型(如Firefox、Chrome)和测试服务器的URL。代码包括一个`BrowserEngine`类,它初始化配置数据,根据配置启动指定的浏览器,并提供关闭浏览器的方法。测试脚本`TestLaunchBrowser`使用`BrowserEngine`来启动浏览器并执行测试。整个框架允许在不同浏览器上运行相同的测试,以确保兼容性和一致性。
70 3