Check Dinâmico com swing

Olá pessoal,
Estou com uma dúvida de como fazer uma função do meu software.

preciso procurar no banco algumas informações e dependendo da quantidade de
registros que a tabela me retornar eu criaria checkBox para essas informações.

EX:

                               Connection con=new Conexao_Central().Conexao();
				
				try{
					
					Statement stm=con.createStatement();
					
					//variável para incrementar o nome do checkbox
					int cont=1;
					
					ResultSet rs=stm.executeQuery("select sum(*) from pdv");
					
					while(rs.next()){
						//nome padrão dos check's
						
						JCheckBox nomecheck = "check"+cont++; //isso que não funciona, dar um valor para o nome
						nomecheck= new JCheckBox();
						
						//no set bounds tbm vai ser feito um incremento						
						nomecheck.setBounds(49, 156, 97, 23);
						contentPane.add(nomecheck);
						
						
					}
					 con.close();
			    }catch(Exception e1){
			    	System.out.println("Erro: " + e1.getMessage()); 
			    }

O Problema: para adicionar vários pelo código que adicionei teria que incrementar o nome de cada checkBox.
mas como esperado ele não deixa por causa dos tipos string e JcheckBox são diferentes.

Se alguém tem alguma ideia, ou já fez algo assim…
obs: o try ta aparecendo só “ry”, no meu código ta correto.

Obrigado

Olá,

tenta usar a função setMnemonic.

Tenta também não misturar a camada de acesso ao banco (DAO) com a de visualização, isso ai vai dar um trabalhão para fazer ajustes lá na frente.

abraço

Se você tem uma coleção de componentes (como JCheckBox ou JTextField) que foi criada dinamicamente em um JFrame ou JPanel, crie uma variável membro no seu JFrame, como List chexboxes = new ArrayList() , e então adicione os combos a essa lista.

Não largue os checkboxes soltos (como você está tentando fazer) porque senão você não consegue achá-los mais :slight_smile:

Olá,

entendi o esquema do list, mas não consegui adicionar checks na lista!!

não teria algum código pra min ter como base, dai só adéquo ele com o código do banco de dados.

obrigado pelas dicas até então!!!

:smiley:

“min ter” é coisa de índio de filme americano. De qualquer maneira, rode este exemplo e veja como é que é fácil você adicionar checkboxes dinamicamente. (A propósito, eu não pus um JScrollPane nesse exemplo, mas acho que seria necessário se você precisar mostrar muitos dados. )

package guj;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class AdicionarCheckboxesDinamicamenteFrame extends JFrame {

    private JPanel contentPane;
    private JPanel panel;
    private JPanel panel_1;
    private JButton btnAdicionarCheckbox;
    private JButton btnRemoverCheckbox;
    private JButton btnRemoverTodos;
    private List<JCheckBox> checkboxes = new ArrayList<JCheckBox>();

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    AdicionarCheckboxesDinamicamenteFrame frame = new AdicionarCheckboxesDinamicamenteFrame();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public AdicionarCheckboxesDinamicamenteFrame() {
        setTitle("Adicionar Checkboxes Dinamicamente");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);
        contentPane.add(getPanel(), BorderLayout.CENTER);
        contentPane.add(getPanel_1(), BorderLayout.SOUTH);
    }

    private JPanel getPanel() {
        if (panel == null) {
            panel = new JPanel();
            panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        }
        return panel;
    }

    private JPanel getPanel_1() {
        if (panel_1 == null) {
            panel_1 = new JPanel();
            panel_1.add(getBtnAdicionarCheckbox());
            panel_1.add(getBtnRemoverCheckbox());
            panel_1.add(getBtnRemoverTodos());
        }
        return panel_1;
    }

    private int indiceCheckbox = 0;

    private JButton getBtnAdicionarCheckbox() {
        if (btnAdicionarCheckbox == null) {
            btnAdicionarCheckbox = new JButton("Adicionar Checkbox");
            btnAdicionarCheckbox.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    JCheckBox checkBox = new JCheckBox();
                    indiceCheckbox++;
                    checkBox.setText(String.format("Combo id # %d", indiceCheckbox));
                    panel.add(checkBox); // adiciona o componente criado ao panel...
                    checkboxes.add(checkBox); // e à lista
                    panel.validate();
                    panel.repaint(); // redesenha o painel para mostrar o novo checkbox
                }
            });
        }
        return btnAdicionarCheckbox;
    }

    private JButton getBtnRemoverCheckbox() {
        if (btnRemoverCheckbox == null) {
            btnRemoverCheckbox = new JButton("Remover Checkbox");
            btnRemoverCheckbox.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    if (checkboxes.size() > 0) {
                        // Vamos remover o último, por exemplo
                        // Primeiramente vamos achar o último elemento...
                        JCheckBox checkBox = checkboxes.get(checkboxes.size() - 1);
                        // Agora vamos removê-lo do panel...
                        panel.remove(checkBox);
                        // e da lista também!
                        checkboxes.remove(checkBox);
                        panel.validate();
                        panel.repaint();
                    }
                }
            });
        }
        return btnRemoverCheckbox;
    }

    private JButton getBtnRemoverTodos() {
        if (btnRemoverTodos == null) {
            btnRemoverTodos = new JButton("Remover Todos");
            btnRemoverTodos.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    for (JCheckBox checkbox : checkboxes) {
                        panel.remove(checkbox); // remove os componentes do panel
                    }
                    checkboxes.clear(); // limpa a lista
                    panel.validate();
                    panel.repaint(); // redesenha o painel para mostrar o novo checkbox
                }
            });
        }
        return btnRemoverTodos;
    }
}

valeu a correção… rsrsrs

Bah cara, valeu mesmo!!!

não vai precisar do Scroll, pois, não são tantos dados no caso.

vou adaptar a minha realidade com os dados do DB.

Obrigado :smiley:

entanglement,

funcionou certinho como queria, a partir do banco de dados carregando certo!!

porém agora não consegui capturar o índice do checkBox selecionado!!!

alguma função para isso também?? tentei usar a do remover check, mas não achei um jeito de pegar o selecionado!

Obrigado