java - GridBagLayout 未对齐 jlabel 和 jbutton
问题描述
所以我正在使用 GridBagLayout 并且我试图在 JPanel 的中心创建一个 JButton,然后在 JPanel 的最顶部有一个 JLabel。当我尝试这样做时,按钮和标签未对齐。
代码:
package view;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class StartPanel extends JPanel {
/**
*
*/
private static final long serialVersionUID = 1L;
//Declare our global variables
JButton btnUploadProject;
JLabel heading;
GridBagConstraints gbc;
GridBagConstraints gbc2;
/**
* Create the panel.
*/
public StartPanel() {
//Set up Panel
this.setVisible(true);
setLayout(new GridBagLayout());
//Create the components
btnUploadProject = new JButton("Upload A Project");
heading = new JLabel("Heading test");
gbc = new GridBagConstraints();
gbc2 = new GridBagConstraints();
//Modify components
btnUploadProject.setPreferredSize(new Dimension(400,100));
btnUploadProject.setFont(new Font("Arial", Font.PLAIN, 40));
heading.setFont(new Font("Arial", Font.PLAIN, 40));
gbc.anchor = GridBagConstraints.CENTER;
gbc2.anchor = GridBagConstraints.NORTH;
gbc2.weighty = 1.0;
//Add the buttons
this.add(btnUploadProject, gbc);
this.add(heading, gbc2);
}
}
解决方案
我相信您的“问题”来自锚参数的错误使用。
来自https://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html:
锚点: 当组件小于其显示区域时使用,以确定放置组件的位置(在区域内)。有效值(定义为 GridBagConstraints 常量)为 CENTER(默认值)、PAGE_START、PAGE_END、LINE_START、LINE_END、FIRST_LINE_START、FIRST_LINE_END、LAST_LINE_END 和 LAST_LINE_START。
所以anchor用来指定组件在他的cell中的位置。
这里有两个单元格:
- 第一个(x:0,y:0):包含您的按钮,锚点= CENTER,您的按钮显示在单元格的中心
- 第二个(x:1,y:0):包含您的标签,锚= NORTH,您的标签显示在单元格的北部
如您所见,单元格位于同一行。如果要将按钮放在标签下方,请使用 gridx/gridy 约束:
gridx, gridy 指定组件左上角的行列。最左列的地址为 gridx=0,顶行的地址为 gridy=0。使用 GridBagConstraints.RELATIVE(默认值)来指定将组件放置在刚刚添加到容器中的组件的右侧(对于 gridx)或正下方(对于 gridy)。我们建议为每个组件指定 gridx 和 gridy 值,而不仅仅是使用 GridBagConstraints.RELATIVE;这往往会导致更可预测的布局。
尝试:
gbc.gridy = 1;
gbc2.gridy = 0;
推荐阅读
- rdkit - RDKIT:组合/添加粒子
- maven - 有没有一种方法可以在 FAT Jar 中包含具有提供范围的依赖项
- javascript - 如何通过设置变量来打破循环?
- kubernetes - Kubernetes LoadBalancer 服务与 hostNetwork 绑定
- c# - dotnet core 创建文件名中没有“CoreFxPipe_”的命名管道
- python - Python:饼图百分比大于数字
- python - 写入页面时不显示更新的 pdf 字段
- jquery - 从主控制器上的 Jquery/Ajax 检索地图功能数据
- jquery - 使用 DataTables 插件导出文件 - 无法显示按钮
- groovy - groovy中的重音字符编码