Como faço para adicionar um componente à um JPanel durante a execução do Programa. Por exemplo,
numa tela tenho um JButton1 e um JPanel1. Quando clico no JButton1 um novo JPanel é adicionado ao JPanel1.
Procurei e não encontrei nada que ajudasse.
Fiz uns códigos que não funcionaram: aparece um monte de exceção.
Grato.
Coloque os codigos aqui para podermos ajudar. =)
Poste as exceçoes tambem.
[]`s
O código.
/* Tenho um frame com dois botões e um painel:
jButton1 e jButton2, jPanel1.
Essa é a parte do código que interessa: */
public class NovoJFrame extends javax.swing.JFrame {
JPanel p = new JPanel();
JPanel p1 = new JPanel();
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
p1.setBackground(Color.BLUE); // pinta com a cor azul
p1.setBounds(jPanel1.getBounds()); // p1 recebe as mesmas dimensões de jPanel1 (eu penso que sim)
p1.setLayout(jPanel1.getLayout()); // p1 recebe o mesmo layout de jPanel1
p1.setLocation(jPanel1.getLocation()); // a mesma localização
/* tudo isso para que p1 ocupe o mesmo espaço de jPanel1 (seja sobreposto) */
jPanel1.add(p1); // aqui p1 é adicionado a jPanel1
jPanel1.validate();
jPanel1.repaint();
this.repaint();
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
p.setBackground(Color.GREEN);
p.setBounds(jPanel1.getBounds()); /* aqui vale os mesmos comentarios acima*/
p.setLayout(jPanel1.getLayout());
p.setLayout(jPanel1.getLayout());
jPanel1.add(p); // pára aqui e dispara exceções
jPanel1.validate();
jPanel1.repaint();
this.validate();
this.repaint();
}
}
Essa é a Exception
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException:
GroupLayout can only be used with one Container at a
time
O Java está te falando que o GroupLayout só pode ser adicionado a um container por vez, quando você faz isso:
está tentando definir a mesma instancia de um layout a dois componente diferentes o p1 e o jPanel1.
Pra tentar corrigir isso é só criar um novo gerenciador de layout e adicioná-lo ao p1:
Muda aí e tenta executar de novo, se der outro erro posta o código com as exceções.
[]s
/* Fiz Duas alterações e funcionou mais ou menos:
Embora p e p1 estejam sendo adicionados à JPanel1, eles
ficam tortos. Jpanel1 tem a forma de um quadrado, p p1 aparecem
apenas no canto inferior direito
Que método uso para que p e p1 fiquem exatamente sobre JPanel1?*/
public class NovoJFrame extends javax.swing.JFrame {
JPanel p = new JPanel();
JPanel p1 = new JPanel();
/* adicionei estas linhas */
GroupLayout layoutP=new GroupLayout(p);
GroupLayout layoutP1=new GroupLayout(p1);
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
p1.setBackground(Color.BLUE); // pinta com a cor azul
p1.setBounds(jPanel1.getBounds()); // p1 recebe as mesmas dimensões de jPanel1 (eu penso que sim)
p1.setLayout(layoutP1); // mudei esta linha: adicionei layoutP1
p1.setLocation(jPanel1.getLocation()); // a mesma localização
/* tudo isso para que p1 ocupe o mesmo espaço de jPanel1 (seja sobreposto) */
jPanel1.add(p1); // aqui p1 é adicionado a jPanel1
jPanel1.validate();
jPanel1.repaint();
this.repaint();
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
p.setBackground(Color.GREEN);
p.setBounds(jPanel1.getBounds()); /* aqui vale os mesmos comentarios acima*/
p.setLayout(layoutP); // mudei esta linha: adicionei layoutP
p.setLocation(jPanel1.getLocation());
jPanel1.add(p); // pára aqui e dispara exceções
jPanel1.validate();
jPanel1.repaint();
this.validate();
this.repaint();
}
}
Essa Exception não aparece mais
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException:
GroupLayout can only be used with one Container at a
time
O problema então é com o gerenciador de layouts que vc está usando.
Aqui tem uma introdução aos principais tipos de layout: http://www.vivaolinux.com.br/artigo/Swing-e-gerenciadores-de-layout/
No site da Sun vc tb acha muito material.
Uma possibilidade é vc colocar o gerenciador como null, se for código acadêmico, e aí vc pode falar em coordenadas onde quer que os componentes fiquem com o método setLocation(), que vc pode definir onde começará seu componente, e setSize, que definirá o tamanho do componente, ou seja até onde ele vai.
Por exemplo:
p2.setLocation(30,30);
p2.setsize(100, 100);
jFrame.add(p2);
p1.setLocation(0,0);
p1.setSize(100,100);
p2.add(p1); // Aí eles tem o mesmo tamanho e, portanto ocuparão o mesmo espaço
Tenta aí, acho que vai dar certo, mas tem que cancelar os gerenciadores de layout, colocando null no setLayout().
[]s
Problema resolvido.
painel p =new painel();
/* adicionar jPanel à Jpanel */
p.setSize(new Dimension(jPanel1.getWidth(), jPanel1.getHeight()));
jPanel1.add(p);
jPanel1.validate();
jPanel1.repaint();
/* remover */
jPanel1.remove(p);
jPanel1.validate();
jPanel1.repaint();
/* jPanel1 é o painel que está no meu frame. p é um objeto jPanel, ou seja, fiz uma classe que extende jFrame e outra que extende jPanel */