Gridbaglayout x alinhamento dos componentes

Já pesquisei um bocado e estou quase convencido de que não dá para fazer, mas, como última tentativa, recorro aos amigos deste fórum.

Em um painel, setei o layout para GridBagLayout com apenas 1 coluna e 4 linhas. Em cada célula coloquei um botão (botao1, botao2, botao3, botao4 e botao5).
A depender do conteúdo de uma variável (status), apenas alguns botões são exibidos.
Por exemplo, quando status = 0, apenas botao1 e botao5 são exibidos.
Quando status = 1, botao1, botao3 e botao5 são exibidos. E assim por diante.

O problema que não consegui superar é que os botões que são exibidos aparecem sempre centralizados (verticalmente) no meio do painel.

Não há como exibi-los a partir do topo do painel?

Você usou o GridBagConstrains para add o elemento no panel???
Se sim… como você o configurou!?

[quote=Rafael_Leal]Você usou o GridBagConstrains para add o elemento no panel???
Se sim… como você o configurou!?[/quote]

Segue o método initComponentes:
(estou quase jogando a toalha)

[code] private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;

    pnBotoes = new javax.swing.JPanel();
    btnAbrir = new javax.swing.JButton();
    btnGravar = new javax.swing.JButton();
    btnFechar = new javax.swing.JButton();
    btnImprimir = new javax.swing.JButton();
    btnFechar = new javax.swing.JButton();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    setTitle("Editor de arquivos");
    setName("frmPrincipal");
    setResizable(false);

    pnBotoes.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 1, true));
    pnBotoes.setName("pnBotoes");
    pnBotoes.setLayout(new java.awt.GridBagLayout());

    btnAbrir.setText("Abrir");
    btnAbrir.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
    btnAbrir.setMaximumSize(new java.awt.Dimension(130, 25));
    btnAbrir.setMinimumSize(new java.awt.Dimension(130, 25));
    btnAbrir.setName("btnAbrir");
    btnAbrir.setPreferredSize(new java.awt.Dimension(130, 25));
    btnAbrir.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            btnAbrirActionPerformed(evt);
        }
    });
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 0;
    gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
    gridBagConstraints.ipadx = 1;
    gridBagConstraints.ipady = 1;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
    gridBagConstraints.insets = new java.awt.Insets(2, 5, 2, 5);
    pnBotoes.add(btnAbrir, gridBagConstraints);
    btnAbrir.getAccessibleContext().setAccessibleName("btnAbrir");

    btnGravar.setText("Gravar");
    btnGravar.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
    btnGravar.setMaximumSize(new java.awt.Dimension(130, 25));
    btnGravar.setMinimumSize(new java.awt.Dimension(130, 25));
    btnGravar.setName("btnGravar");
    btnGravar.setPreferredSize(new java.awt.Dimension(130, 25));
    btnGravar.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            btnGravarActionPerformed(evt);
        }
    });
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 4;
    gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
    gridBagConstraints.insets = new java.awt.Insets(2, 5, 2, 5);
    pnBotoes.add(btnGravar, gridBagConstraints);

    btnFechar.setText("Fechar");
    btnFechar.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
    btnFechar.setMaximumSize(new java.awt.Dimension(130, 25));
    btnFechar.setMinimumSize(new java.awt.Dimension(130, 25));
    btnFechar.setPreferredSize(new java.awt.Dimension(130, 25));
    btnFechar.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            btnFecharActionPerformed(evt);
        }
    });
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 2;
    gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
    gridBagConstraints.ipadx = 1;
    gridBagConstraints.ipady = 1;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
    gridBagConstraints.insets = new java.awt.Insets(2, 5, 2, 5);
    pnBotoes.add(btnFechar, gridBagConstraints);

    btnImprimir.setText("Imprimir");
    btnImprimir.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
    btnImprimir.setMaximumSize(new java.awt.Dimension(130, 25));
    btnImprimir.setMinimumSize(new java.awt.Dimension(130, 25));
    btnImprimir.setPreferredSize(new java.awt.Dimension(130, 25));
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 3;
    gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
    gridBagConstraints.ipadx = 1;
    gridBagConstraints.ipady = 1;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
    gridBagConstraints.insets = new java.awt.Insets(2, 5, 2, 5);
    pnBotoes.add(btnImprimir, gridBagConstraints);

    btnFechar.setText("Fechar");
    btnFechar.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
    btnFechar.setMaximumSize(new java.awt.Dimension(130, 25));
    btnFechar.setMinimumSize(new java.awt.Dimension(130, 25));
    btnFechar.setPreferredSize(new java.awt.Dimension(130, 25));
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 1;
    gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
    gridBagConstraints.ipadx = 1;
    gridBagConstraints.ipady = 1;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
    gridBagConstraints.insets = new java.awt.Insets(2, 5, 2, 5);
    pnBotoes.add(btnFechar, gridBagConstraints);


    pnBotoes.getAccessibleContext().setAccessibleName("pnBotoes");

    pack();

}// </editor-fold>//GEN-END:initComponents

[/code]

REMOVA TODAS:

gridBagConstraints.ipadx
gridBagConstraints.ipadx
gridBagConstraints.insets = new java.awt.Insets(2, 5, 2, 5);
Isso aqui tira os componentes canto da celula do grid…


VERIFICA SE REALMENTE PRECISA:

gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
Isso dita a orientação… porque java.awt.GridBagConstraints.FIRST_LINE_START e não java.awt.GridBagConstraints.NORTHWEST?

gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
Isso dita se o componente vai ocupar toda a celula…

[quote=Rafael_Leal]REMOVA TODAS:

gridBagConstraints.ipadx
gridBagConstraints.ipadx
gridBagConstraints.insets = new java.awt.Insets(2, 5, 2, 5);
Isso aqui tira os componentes canto da celula do grid…


VERIFICA SE REALMENTE PRECISA:

gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
Isso dita a orientação… porque java.awt.GridBagConstraints.FIRST_LINE_START e não java.awt.GridBagConstraints.NORTHWEST?

gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
Isso dita se o componente vai ocupar toda a celula…[/quote]

Infelizmente não funcionou.

O “menu” de botões continua sendo exibido mais ou menos assim:


   Abrir     
  Fechar    

Quando eu queria que fosse exibido assim:


   Abrir
  Fechar

Obs.: as linhas tracejadas representam o topo e o fim do painel.

Estou quase desistindo (já gastei muitas horas nisso) e partindo para a alternativa de exibir todos os botões, habilitando-os ou desabilitando-os de acordo com o conteúdo da variável status.

[quote=andredf][quote=Rafael_Leal]REMOVA TODAS:

gridBagConstraints.ipadx
gridBagConstraints.ipadx
gridBagConstraints.insets = new java.awt.Insets(2, 5, 2, 5);
Isso aqui tira os componentes canto da celula do grid…


VERIFICA SE REALMENTE PRECISA:

gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
Isso dita a orientação… porque java.awt.GridBagConstraints.FIRST_LINE_START e não java.awt.GridBagConstraints.NORTHWEST?

gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
Isso dita se o componente vai ocupar toda a celula…[/quote]

Infelizmente não funcionou.

O “menu” de botões continua sendo exibido mais ou menos assim:


   Abrir     
  Fechar    

Quando eu queria que fosse exibido assim:


   Abrir
  Fechar

Obs.: as linhas tracejadas representam o topo e o fim do painel.

Estou quase desistindo (já gastei muitas horas nisso) e partindo para a alternativa de exibir todos os botões, habilitando-os ou desabilitando-os de acordo com o conteúdo da variável status.

[/quote]

Tem certeza que o tamanho do JPanel são as linhas demonstradas?

O JPanel pnBotoes… quem é o parent JFrame ou JInternalFrame…?
Pois se o tamanho deste pai for maior que o filho JPanel pnBotoes por default o Java centraliza o JPanel no centro o pai… Qual é o layout que vc usa neste pai?
Essa propria classe em sim paracesse estender JFrame, JInternalFrame ou DesktopPane… ela tem qual layout? Use o FlowLayout nela.
Como o JPanel pnBotoes tem o layout tipo GridBagLayout ele DEVERIA colocar os elementos inseridos nele apartir o canto superior esquerdo mais extremo (Célula 0,0)

O erro que está sendo causado é aqui:

....
// Cadê a definição do GridBagLayout do JPanel pnBotoes ?
pnBotoes = new javax.swing.JPanel();
....

// O certo é
pnBotoes = new javax.swing.JPanel(new GridBagLayout());  

Olhando diretamente para o seu código, creio eu que você está tendo um trabalhão, escrevendo muito código e atributos para cada componente do formulário, agora imagine se você tiver que escrever tudo isto em vários formulários que você cria ? A única solução para isto, é criar uma classe padrão que estende (herda) de JPanel, e ali já defini os atributos do GridBagLayout, depois é só configurar o layout de cada Frame com este JPanel já configurado, assim:

import java.awt.*;
import javax.swing.*;

public class ContentLayout extends JPanel {
    private static final long serialVersionUID = 1L;

    // Definição do Layout e das restrições do Layout
    private GridBagLayout layout;
    private GridBagConstraints constraints;

    // Definição das constantes
    public final int horizontal = GridBagConstraints.HORIZONTAL;
    public final int vertical = GridBagConstraints.VERTICAL;
    public final int both = GridBagConstraints.BOTH;
    public final int remainder = GridBagConstraints.REMAINDER;
    public final int relative = GridBagConstraints.RELATIVE;
    

    //Construtor do objeto para um layout padrão
    public ContentLayout(){
       layout = new GridBagLayout();
       setLayout(layout);
       constraints = new GridBagConstraints();
       constraints.weightx = 1;
       constraints.weighty = 1;
       constraints.insets = new Insets(0,0,0,0);
    }
    
    // Construtor do objeto para um layout configurado externamente
    public ContentLayout(int x, int y, int top, int left, int botton, int right){
       layout = new GridBagLayout();
       setLayout(layout);
       constraints = new GridBagConstraints();
       constraints.weightx = x;
       constraints.weighty = y;
       constraints.insets = new Insets(top, left, botton, right);
    }

    // Método para acrescentar o componente no JPanel.
    public void addComponent(Component comp, int row, int column, int width, int height, int fill){
        constraints.fill = fill;
        constraints.gridx = column;
        constraints.gridy = row;
        constraints.gridwidth = width;
        constraints.gridheight = height;
        layout.setConstraints(comp, constraints);
        add(comp);
    }
    
    // Método add para ser usado com as constraints REMAINDER E RELATIVE
    public void addComponent(Component comp, int fill, int width){
        constraints.fill = fill;
        constraints.gridwidth = width;
        constraints.weightx = 1;
        constraints.weighty = 1;
        layout.setConstraints(comp, constraints);
        add(comp);
    }

    // Método para definições de bordas do JPanel, inclusive com título.
    public void setBorder(Color color, int thickness){
        setBorder(BorderFactory.createLineBorder(color, thickness));
    }

    public void setTitle(String title){
        setBorder(BorderFactory.createTitledBorder(title));
    }

    public void setTitle(String title, Color color, int thickness){
        setBorder(BorderFactory.createLineBorder(color, thickness));
        setBorder(BorderFactory.createTitledBorder(getBorder(), title));
    }
}

Bom, ai você poderia usar no JFrame ou JInternal Frame assim:

public class MinhaClasse extends JFrame {

      public MinhaClasse() {
           setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);  
           setTitle("Editor de arquivos");  
           setName("frmPrincipal");  
           setResizable(false); 
 
           /* definindo o tamanho do JFrame,
               se o mesmo não for suficiente para
               apresentar todos os botões, então
               aumente a sua dimensão */
           setPreferredSize(new Dimension(820,620));
          
           // Configurando o layout do JFrame.
           setContentPane(getContainer());
          
           //Redesenhando o JFrame.
           pack();
          
           // Centralizando o JFrame.
           setLocationRelativeTo(null); 
          
      }

     public ContentLayout getContainer() {
        // Com o layout padrão definido na classe.
        ContentLayout layout = new ContentLayout();
        
        // ou se preferir fazer a definição aqui        
        ContentLayout layout = new ContentLayout(1, 1, 2, 2, 2, 2);
        
        // Instanciando os Botões.
        btnAbrir = new javax.swing.JButton();  
        btnGravar = new javax.swing.JButton();  
        btnFechar = new javax.swing.JButton();  
        btnImprimir = new javax.swing.JButton();  
        btnFechar = new javax.swing.JButton();

        /* Localizando o btnAbrir na
            linha 0, coluna 0, ocupando uma coluna e uma linha
            e preenchendo a célula somente na horizontal. */
        layout.addComponent(btnAbrir, 0, 0, 1, 1, layout.horizontal);
        ......
        ......
        /* Localizando o btnGravar na
            linha 0, coluna 1, ocupando quatro colunas e uma linha
            e preenchendo a célula somente na horizontal. */
        layout.addComponent(btnGravar, 0, 1, 4, 1, layout.horizontal);
         ......
        /* Localizando o btnFechar na
            linha 1, coluna 0, ocupando uma coluna e duas linhas
            e preenchendo a célula somente na horizontal. */
        layout.addComponent(btnGravar, 0, 1, 1, 2, layout.horizontal);
        ....
        ....
        // E por ai vai.
        ....
        ....
        return layout;
       
    }
.....
.....
}

Veja quanto código você pode economizar.

Rode ai e veja como funciona.