I've just started working with GridBagLayout
, and the image below is pretty self-explanatory of the problem, I need the first JTextField
of the first 4 rows to stretch all the way to the JLabel
on the left, just like the right ones.
The Component's grid widths, from top to bottom, are :
1, 1, 1, 1
1, 3
1, 1, 1, 1
1, 3
2, 2
2, 2
Code of the GridBagConstraints
settings in the JFrame :
Also, why even if I set anchor to 'NORTH', all the components still sit aligned at the center of the JPanel?
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(10, 10, 10, 10);
labelNome = new JLabel("Nome:");
gbc.gridx = 0;
gbc.gridy = 0;
gbc.fill = GridBagConstraints.BOTH;
add(labelNome, gbc);
tfNome = new JTextField();
gbc.gridx = 1;
gbc.ipadx = 50;
gbc.fill = GridBagConstraints.HORIZONTAL;
add(tfNome, gbc);
labelIdade = new JLabel("Idade :");
gbc.ipadx = 0;
gbc.gridx = 2;
gbc.fill = GridBagConstraints.BOTH;
add(labelIdade, gbc);
tfIdade = new JTextField();
gbc.gridx = 3;
gbc.ipadx = 50;
gbc.fill = GridBagConstraints.HORIZONTAL;
add(tfIdade, gbc);
labelEndereco = new JLabel("Endereço :");
gbc.ipadx = 50;
gbc.gridx = 0;
gbc.gridy = 1;
gbc.fill = GridBagConstraints.BOTH;
add(labelEndereco, gbc);
tfEndereco = new JTextField();
gbc.ipadx = 50;
gbc.gridx = 1;
gbc.gridwidth = 3;
gbc.fill = GridBagConstraints.HORIZONTAL;
add(tfEndereco, gbc);
labelFiliacao = new JLabel("Filiação :");
gbc.gridwidth = 1;
gbc.gridx = 0;
gbc.gridy = 2;
gbc.fill = GridBagConstraints.BOTH;
add(labelFiliacao, gbc);
tfFiliacao = new JTextField();
gbc.gridx = 1;
gbc.ipadx = 50;
gbc.fill = GridBagConstraints.HORIZONTAL;
add(tfFiliacao, gbc);
labelTurma = new JLabel("Turma :");
gbc.ipadx = 0;
gbc.gridx = 2;
gbc.fill = GridBagConstraints.BOTH;
add(labelTurma, gbc);
tfTurma = new JTextField();
gbc.gridx = 3;
gbc.ipadx = 50;
gbc.fill = GridBagConstraints.HORIZONTAL;
add(tfTurma, gbc);
labelDisciplina = new JLabel("Disciplina :");
gbc.ipadx = 0;
gbc.gridx = 0;
gbc.gridy = 3;
gbc.fill = GridBagConstraints.BOTH;
add(labelDisciplina, gbc);
tfDisciplina = new JTextField();
gbc.gridwidth = 1;
gbc.ipadx = 50;
gbc.ipady = 0;
gbc.gridx = 1;
gbc.gridwidth = 3;
gbc.fill = GridBagConstraints.HORIZONTAL;
add(tfDisciplina, gbc);
adicionaDisciplina = new JButton("Adicionar disciplina");
gbc.gridwidth = 2;
gbc.gridx = 0;
gbc.gridy = 4;
gbc.fill = GridBagConstraints.NONE;
add(adicionaDisciplina, gbc);
limparDisciplina = new JButton("Limpar lista de disciplinas");
gbc.gridx = 2;
add(limparDisciplina, gbc);
botaoSalvar = new JButton("Salvar");
gbc.gridx = 0;
gbc.gridy = 5;
add(botaoSalvar, gbc);
botaoCancelar = new JButton("Cancelar");
gbc.gridx = 2;
add(botaoCancelar, gbc);
use this code
GridBagLayout sizes the columns based on the preferred sizes of the components within them.
The buttons at the bottom are throwing off your widths a bit since "Limpar lista de disciplinas" takes up more space than "Adicionar disciplina". If you first create Limpar, then you can set the preferred width of Adicionar based on Limpar's preferred width. i.e.
The labels on the left side are getting ipadx = 50, but on the right side the labels have ipadx = 0. This is why the text fields appear closer to the labels on the right side than they do on the left side. If the width is still a concern you can use the same trick of setting the preferred size for the labels or text fields like I suggested for the buttons.