为什么 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。
在下面的代码中,我创建了一个带有 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。