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.
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…
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.
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)
....
// 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;
}
.....
.....
}