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

Preventing Swing Components from Becoming Off-Centered when using GridBagLayout in Java

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

我遇到的具体问题如下图所示。我需要 "File Name:" 旁边的 JTextField 有一定的长度。但是当我把它做成一定长度时,它会导致其他行中的其他组件变得偏心。保持所有组件居中的唯一方法似乎是让两个 JTextFields 的长度相同。

总的来说,我对 Swing 和 Java GUI 有点陌生,所以我可能遗漏了一些基本概念,但我还没有从我的搜索中找到这个特定问题的答案。

Image Showing the Components becoming Off-Centered when the JTextField length changes

>

//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);

}
如果 gbc.fillNone

gbc.gridweightxgbc.gridweighty 没有意义。只有字段应该接收额外的 space (fill == HORIZONTAL and weightx != 0)

I guess what I'm really wanting is for both columns of cells to be of equal width,

那么您应该将 "Start" 和 "Stop" 按钮放在它们自己的列中。 Then 应该有一个 1.0 的 weightx 以允许 then 扩展。它们应该居中。

注意:它们不会完全居中,因为开始按钮的宽度会比停止按钮稍大,所以它会有一些额外的像素 space。

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