在Java中使用GridBagLayout时防止Swing组件偏离中心

在Java中使用GridBagLayout时防止Swing组件偏离中心,java,swing,center,layout-manager,gridbaglayout,Java,Swing,Center,Layout Manager,Gridbaglayout,我试图用Java中的Swing组件制作一个简单的GUI。但是,由于其他组件的尺寸,一些组件偏离中心。我使用GridBagConstraints.CENTER使这些组件居中,但它似乎只使它们相对于包含它们的网格单元居中 我的具体问题如下图所示。我需要“File Name:”旁边的JTextField具有一定的长度。但当我将其设置为一定长度时,会导致其他行中的其他组件偏离中心。保持所有组件居中的唯一方法似乎是使两个JTextFields的长度相同 一般来说,我对Swing和JavaGUI有点陌生,所

我试图用Java中的Swing组件制作一个简单的GUI。但是,由于其他组件的尺寸,一些组件偏离中心。我使用GridBagConstraints.CENTER使这些组件居中,但它似乎只使它们相对于包含它们的网格单元居中

我的具体问题如下图所示。我需要“File Name:”旁边的JTextField具有一定的长度。但当我将其设置为一定长度时,会导致其他行中的其他组件偏离中心。保持所有组件居中的唯一方法似乎是使两个JTextFields的长度相同

一般来说,我对Swing和JavaGUI有点陌生,所以我可能缺少一些基本概念,但我还没有从搜索中找到这个特定问题的答案

>


gbc.gridweightx
gbc.gridweighty
如果
gbc.fill
None
则没有意义。只有字段应该接收额外的空间(
fill==水平和权重x!=0


我想我真正想要的是两列单元格的宽度相等

因此,您应该在自己的列中有“开始”和“停止”按钮。然后应该有一个权重x为1.0,以允许然后展开。它们应该居中

注意:它们不会完全居中,因为“开始”按钮的宽度将略大于“停止”按钮,因此它将有一些额外的像素空间


对于所有其他数据行,您需要向每行添加一个组件。然后,每个组件需要2的gridwidth。每个组件都将居中。由于前两行包含两个组件,因此需要创建一个面板并将组件添加到面板中。然后使用GridBagLayout将面板添加到面板中。

GridBagContraints.CENTER的设计正是为了:使单元中的组件中心居中(垂直和水平)。应将frame.setSize替换为
frame.pack()
。GridBagLayout没有足够的空间来布置组件。
但它似乎只能使组件相对于所包含的网格单元居中。
-正确,组件位于单元内。我不知道“中心”对你意味着什么。绘制ascii图表,显示您希望组件的显示方式。也许你希望“开始”按钮显示在单元格的左边缘,而“停止”按钮显示在单元格的右边缘?我想我真正想要的是两列单元格的宽度相等,而不是根据内容而变化。在我的具体示例中,由于JTextField,右栏变宽了,尽管单元格中还有足够的空间供JTextField占用。我不知道这是为什么。1)为了更快地得到更好的帮助,发布一个或。2) 提示:添加@camickr(或任何人,
@
很重要)以通知此人新的评论。你所说的不是真的。如果为组件提供额外的空间并修改约束的定位,您将看到组件不会显示在某个位置。您是对的,但这不是人们通常想要的。我应该用“没有用”来代替“没有意义”。
//Initialize global Swing objects
JFrame frame = new JFrame("Game Server V2.0 build 019827427");
JPanel panel = new JPanel();
JButton runButton = new JButton("Start Server");
JButton stopButton = new JButton("Stop Server");
JButton sendButton = new JButton("Send File");
JTextField portField = new JTextField("999", 5);
JTextField fileField = new JTextField("fileToSend.txt", 14);
JLabel portLabel = new JLabel("Port:  ");
JLabel fileLabel = new JLabel("File Name:  ");
JLabel statusLabel = new JLabel("Status: Disconnected");

public void run(){

    //Set layout and constraints
    panel.setLayout(new GridBagLayout()); 
    GridBagConstraints gc = new GridBagConstraints();

    //Add Swing components to panel using GridBagLayout with the GridBagConstraints we've specified
    gc.weightx = 0.5;
    gc.weighty = 0.5;

    gc.gridx = 0;
    gc.gridy = 0;
    gc.gridwidth = 1;
    gc.anchor = GridBagConstraints.LINE_END;
    panel.add(portLabel, gc);

    gc.gridx = 1;
    gc.gridy = 0;
    gc.gridwidth = 1;
    gc.anchor = GridBagConstraints.LINE_START;
    panel.add(portField, gc); 

    gc.gridx = 0;
    gc.gridy = 1;
    gc.gridwidth = 1;
    gc.anchor = GridBagConstraints.LINE_END;
    panel.add(fileLabel, gc);

    gc.gridx = 1;
    gc.gridy = 1;
    gc.gridwidth = 1;
    gc.anchor = GridBagConstraints.LINE_START;
    panel.add(fileField, gc);

    gc.gridx = 0;
    gc.gridy = 2;
    gc.gridwidth = 2;
    gc.anchor = GridBagConstraints.CENTER;
    panel.add(sendButton, gc);

    gc.gridx = 0;
    gc.gridy = 3;
    gc.gridwidth = 1;
    panel.add(runButton, gc);

    gc.gridx = 1;
    gc.gridy = 3;
    gc.gridwidth = 1;
    panel.add(stopButton, gc);

    gc.gridx = 0;
    gc.gridy = 4;
    gc.gridwidth = 2;
    panel.add(statusLabel, gc);

    frame.add(panel);
    frame.setSize(480, 280);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

}