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.
Você usou o GridBagConstrains para add o elemento no panel???
Se sim… como você o configurou!?
A
andredf
Rafael_Leal:
Você usou o GridBagConstrains para add o elemento no panel???
Se sim... como você o configurou!?
Segue o método initComponentes:
(estou quase jogando a toalha)
privatevoidinitComponents(){java.awt.GridBagConstraintsgridBagConstraints;pnBotoes=newjavax.swing.JPanel();btnAbrir=newjavax.swing.JButton();btnGravar=newjavax.swing.JButton();btnFechar=newjavax.swing.JButton();btnImprimir=newjavax.swing.JButton();btnFechar=newjavax.swing.JButton();setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);setTitle("Editor de arquivos");setName("frmPrincipal");setResizable(false);pnBotoes.setBorder(newjavax.swing.border.LineBorder(newjava.awt.Color(0,0,0),1,true));pnBotoes.setName("pnBotoes");pnBotoes.setLayout(newjava.awt.GridBagLayout());btnAbrir.setText("Abrir");btnAbrir.setBorder(javax.swing.BorderFactory.createEmptyBorder(1,1,1,1));btnAbrir.setMaximumSize(newjava.awt.Dimension(130,25));btnAbrir.setMinimumSize(newjava.awt.Dimension(130,25));btnAbrir.setName("btnAbrir");btnAbrir.setPreferredSize(newjava.awt.Dimension(130,25));btnAbrir.addActionListener(newjava.awt.event.ActionListener(){publicvoidactionPerformed(java.awt.event.ActionEventevt){btnAbrirActionPerformed(evt);}});gridBagConstraints=newjava.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=newjava.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(newjava.awt.Dimension(130,25));btnGravar.setMinimumSize(newjava.awt.Dimension(130,25));btnGravar.setName("btnGravar");btnGravar.setPreferredSize(newjava.awt.Dimension(130,25));btnGravar.addActionListener(newjava.awt.event.ActionListener(){publicvoidactionPerformed(java.awt.event.ActionEventevt){btnGravarActionPerformed(evt);}});gridBagConstraints=newjava.awt.GridBagConstraints();gridBagConstraints.gridx=0;gridBagConstraints.gridy=4;gridBagConstraints.fill=java.awt.GridBagConstraints.BOTH;gridBagConstraints.anchor=java.awt.GridBagConstraints.FIRST_LINE_START;gridBagConstraints.insets=newjava.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(newjava.awt.Dimension(130,25));btnFechar.setMinimumSize(newjava.awt.Dimension(130,25));btnFechar.setPreferredSize(newjava.awt.Dimension(130,25));btnFechar.addActionListener(newjava.awt.event.ActionListener(){publicvoidactionPerformed(java.awt.event.ActionEventevt){btnFecharActionPerformed(evt);}});gridBagConstraints=newjava.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=newjava.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(newjava.awt.Dimension(130,25));btnImprimir.setMinimumSize(newjava.awt.Dimension(130,25));btnImprimir.setPreferredSize(newjava.awt.Dimension(130,25));gridBagConstraints=newjava.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=newjava.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(newjava.awt.Dimension(130,25));btnFechar.setMinimumSize(newjava.awt.Dimension(130,25));btnFechar.setPreferredSize(newjava.awt.Dimension(130,25));gridBagConstraints=newjava.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=newjava.awt.Insets(2,5,2,5);pnBotoes.add(btnFechar,gridBagConstraints);pnBotoes.getAccessibleContext().setAccessibleName("pnBotoes");pack();}//</editor-fold>//GEN-END:initComponents
R
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…
A
andredf
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…
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.
R
Rafael_Leal
andredf:
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…
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.
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)
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:
importjava.awt.*;importjavax.swing.*;publicclassContentLayoutextendsJPanel{privatestaticfinallongserialVersionUID=1L;// Definição do Layout e das restrições do LayoutprivateGridBagLayoutlayout;privateGridBagConstraintsconstraints;// Definição das constantespublicfinalinthorizontal=GridBagConstraints.HORIZONTAL;publicfinalintvertical=GridBagConstraints.VERTICAL;publicfinalintboth=GridBagConstraints.BOTH;publicfinalintremainder=GridBagConstraints.REMAINDER;publicfinalintrelative=GridBagConstraints.RELATIVE;//Construtor do objeto para um layout padrãopublicContentLayout(){layout=newGridBagLayout();setLayout(layout);constraints=newGridBagConstraints();constraints.weightx=1;constraints.weighty=1;constraints.insets=newInsets(0,0,0,0);}// Construtor do objeto para um layout configurado externamentepublicContentLayout(intx,inty,inttop,intleft,intbotton,intright){layout=newGridBagLayout();setLayout(layout);constraints=newGridBagConstraints();constraints.weightx=x;constraints.weighty=y;constraints.insets=newInsets(top,left,botton,right);}// Método para acrescentar o componente no JPanel.publicvoidaddComponent(Componentcomp,introw,intcolumn,intwidth,intheight,intfill){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 RELATIVEpublicvoidaddComponent(Componentcomp,intfill,intwidth){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.publicvoidsetBorder(Colorcolor,intthickness){setBorder(BorderFactory.createLineBorder(color,thickness));}publicvoidsetTitle(Stringtitle){setBorder(BorderFactory.createTitledBorder(title));}publicvoidsetTitle(Stringtitle,Colorcolor,intthickness){setBorder(BorderFactory.createLineBorder(color,thickness));setBorder(BorderFactory.createTitledBorder(getBorder(),title));}}
Bom, ai você poderia usar no JFrame ou JInternal Frame assim:
publicclassMinhaClasseextendsJFrame{publicMinhaClasse(){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(newDimension(820,620));// Configurando o layout do JFrame.setContentPane(getContainer());//Redesenhando o JFrame.pack();// Centralizando o JFrame.setLocationRelativeTo(null);}publicContentLayoutgetContainer(){// Com o layout padrão definido na classe.ContentLayoutlayout=newContentLayout();// ou se preferir fazer a definição aqui ContentLayoutlayout=newContentLayout(1,1,2,2,2,2);// Instanciando os Botões.btnAbrir=newjavax.swing.JButton();btnGravar=newjavax.swing.JButton();btnFechar=newjavax.swing.JButton();btnImprimir=newjavax.swing.JButton();btnFechar=newjavax.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.........returnlayout;}..........}