java - JTextField 在 GridBagLayout 中未对齐

标签 java swing layout-manager gridbaglayout

我刚刚开始使用 GridBagLayout,下图很容易说明问题,我需要前 4 行中的第一个 JTextField 一直延伸到左侧的 JLabel,就像右侧的一样。

enter image description here

组件的网格宽度从上到下为:

1, 1, 1, 1

1, 3

1, 1, 1, 1

1, 3

2, 2

2, 2

JFrame 中 GridBagConstraints 设置的代码:

另外,为什么即使我将 anchor 设置为“NORTH”,所有组件仍然位于 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);

最佳答案

GridBagLayout 根据列中组件的首选大小来调整列的大小。

  1. 底部的按钮有点超出你的宽度,因为“Limpar lista de disciplinas”比“Adicionar disciplina”占用更多空间。如果您首先创建 Limpar,那么您可以根据 Limpar 的首选宽度设置 Adicionar 的首选宽度。即

    JButton limparDisciplina = new JButton("Limpar lista de disciplinas");
    JButton adicionaDisciplina = new JButton("Adicionar disciplina");
    adicionaDisciplina.setPreferredSize(limparDisciplina.getPreferredSize());
    
  2. 左侧标签的 ipadx = 50,但右侧标签的 ipadx = 0。这就是为什么右侧的文本字段看起来比左侧更靠近标签。 如果宽度仍然是一个问题,您可以使用相同的技巧为标签或文本字段设置首选大小,就像我为按钮建议的那样。

关于java - JTextField 在 GridBagLayout 中未对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31011894/

相关文章:

java - org.apache.tiles.util.TilesIOException

java - 应用程序只是强制关闭并停止工作,为什么?

java - 我认为我需要添加一个按键监听器

java - MigLayout 换行两行

java - 输入值少于数组长度

java - 如何编写分析器?

java - 按住键会破坏 java swing 形式

java - JScrollPane - 防止顶部的可见组件移动

java - 如何停止改变按钮的位置?

java - 如何在 JOptionPane 中的背景图像上对齐多个文本字段?