为什么 GridBagConstraints 将对象聚集在 JPanel 的中心?

Why is GridBagConstraints gathering the objects in the centre of the JPanel?

在下面的代码中,我创建了一个带有 JMenuBar 和 JPanel 的 JFrame,后者具有三个 JTextFields 和三个 JLabel。但是,JPanel 的所有组件都集中在中心。我在添加组件之前设置了布局,所以我不认为这是这个问题(我以前遇到过)。如果有人知道如何解决这个问题,我将不胜感激。

public class InterfaceWindow {
private static final Logger LOGGER = Logger.getLogger(DownloadWindow.class.getName());

private JButton helpJButton;
private JButton copyToClipBoardJButton;
private JButton enterJButton;
private JButton selectFileJButton;
private JLabel pathJLabel;
private JLabel jobNameJLabel;
private JLabel emailJLabel;
private JTextField pathJTextField;
private JTextField jobNameJTextField;
private JTextField emailJTextField;
private JTextArea transcriptionJTextArea;
private JMenu accountJMenu;
private JMenu jobsJMenu;
private JMenu helpJMenu;
private JMenuBar toolBarJMenuBar = new JMenuBar();
private JMenuItem uploadYouTubeJMenuItem;
private JMenuItem uploadFileJMenuItem;
private JMenuItem downloadJMenuItem;
private JMenuItem helpJMenuItem;
private GridBagConstraints panelGbc = new GridBagConstraints();
private GridBagConstraints frameGbc = new GridBagConstraints();
private JPanel interfaceJPanel = new JPanel();
private String emptyField = "default";
private String filePath = "default";

public JButton getHelpJButton() {
    return helpJButton;
}

public JButton getCopyToClipBoardJButton() {
    return copyToClipBoardJButton;
}

public JButton getEnterJButton() {
    return enterJButton;
}

public JButton getSelectFileJButton() {
    return selectFileJButton;
}

public JFrame setInterfaceWindow() {
    JFrame interfaceJFrame = new JFrame();
    frameGbc.fill = GridBagConstraints.HORIZONTAL;
    interfaceJPanel = setInterfaceJPanel();

    interfaceJFrame.getContentPane().setLayout(new GridBagLayout());
    interfaceJFrame.setLayout(new GridBagLayout());
    interfaceJFrame.setDefaultCloseOperation(EXIT_ON_CLOSE);
    interfaceJFrame.setTitle("Audio Transcribe");
    interfaceJFrame.setSize(800, 800);
    interfaceJFrame.setLocationRelativeTo(null);
    interfaceJFrame.setJMenuBar(setToolBar(toolBarJMenuBar));
    interfaceJFrame.add(interfaceJPanel, frameGbc);
    interfaceJFrame.setVisible(true);

    return interfaceJFrame;
}

private JPanel setInterfaceJPanel() {
    panelGbc.fill = GridBagConstraints.HORIZONTAL;
    panelGbc.insets.bottom = 1;
    panelGbc.insets.top = 2;
    panelGbc.insets.right = 1;
    panelGbc.insets.left = 1;
    panelGbc.weightx = 1;
    panelGbc.weighty = 1;

    interfaceJPanel.setLayout(new GridBagLayout());
    interfaceJPanel.setSize(800, 700);
    setJobName(interfaceJPanel);
    setPath(interfaceJPanel);
    setEmail(interfaceJPanel);
    setButtons(interfaceJPanel);
    setTextArea(interfaceJPanel);
    setAction();

    return interfaceJPanel;
}

public JMenuBar setToolBar(JMenuBar toolBarJMenuBar) {
    accountJMenu = new JMenu("Accounts");
    jobsJMenu = new JMenu("Jobs");
    helpJMenu = new JMenu("Help");

    toolBarJMenuBar.add(accountJMenu);
    toolBarJMenuBar.add(jobsJMenu);
    toolBarJMenuBar.add(helpJMenu);

    downloadJMenuItem = new JMenuItem("Download");
    uploadFileJMenuItem = new JMenuItem("Upload file");
    uploadYouTubeJMenuItem = new JMenuItem("Upload from YouTube");
    helpJMenuItem = new JMenuItem("Help");

    jobsJMenu.add(downloadJMenuItem);
    jobsJMenu.addSeparator();
    jobsJMenu.add(uploadFileJMenuItem);
    jobsJMenu.addSeparator();
    jobsJMenu.add(uploadYouTubeJMenuItem);
    helpJMenu.add(helpJMenuItem);

    return toolBarJMenuBar;
}

private void setEmail(JPanel interfaceJPanel) {
    JLabel emailLabel = new JLabel("Email:");

    panelGbc.gridx = 1;
    panelGbc.gridy = 3;
    panelGbc.gridwidth = 1;
    panelGbc.gridheight = 1;
    interfaceJPanel.add(emailLabel, panelGbc);

    emailJTextField = new JTextField();

    emailJTextField.setText(emptyField);
    panelGbc.gridx = 2;
    panelGbc.gridy = 3;
    panelGbc.gridwidth = 3;
    panelGbc.gridheight = 1;
    interfaceJPanel.add(emailJTextField, panelGbc);
}

private void setPath(JPanel interfaceJPanel) {
    JLabel filePathLabel = new JLabel("File path:");

    panelGbc.gridx = 1;
    panelGbc.gridy = 0;
    panelGbc.gridwidth = 1;
    panelGbc.gridheight = 1;
    interfaceJPanel.add(filePathLabel, panelGbc);

    pathJTextField = new JTextField();
    pathJTextField.setText(filePath);
    panelGbc.gridx = 2;
    panelGbc.gridy = 0;
    panelGbc.gridwidth = 2;
    panelGbc.gridheight = 1;
    interfaceJPanel.add(pathJTextField, panelGbc);
}

private void setJobName(JPanel interfaceJPanel) {
    JLabel jobNameLabel = new JLabel("Job name:");

    panelGbc.gridx = 1;
    panelGbc.gridy = 2;
    panelGbc.gridwidth = 1;
    panelGbc.gridheight = 1;
    interfaceJPanel.add(jobNameLabel, panelGbc);

    jobNameJTextField = new JTextField();
    jobNameJTextField.setText(emptyField);
    panelGbc.gridx = 2;
    panelGbc.gridy = 2;
    panelGbc.gridwidth = 2;
    panelGbc.gridheight = 1;
    interfaceJPanel.add(jobNameJTextField, panelGbc);
}

private void setAction() {
}

private void setTextArea(JPanel interfaceJPanel) {
}

private void setButtons(JPanel interfaceJPanel) {
}
}

这是因为您使用 GridBagLayout 嵌套了两个 JPanel,并且在将内部 JPanel 添加到外部面板时,您的 frameGbc 约束没有设置 weightx 或 weighty,使内部 JPanel 居中。内部 JPanel 的大小将调整为其 preferredSize,即尺寸尽可能小,并将居中。

最好不要这样做。而是让 JFrame 继续使用 BorderLayout,并使用 JPanel 添加 GridBagLayout BorderLayout.CENTER,或者不要不必要地嵌套 JPanels,只给 contentPane 一个 GridBagLayout。