Ir ao conteúdo

Java Lista de Chamada em Java


Ir à solução Resolvido por AdrianoSiqueira,

Posts recomendados

Postado

 

Eu estou fazendo uma lista de chamada em java com banco de dados usando o mysql workbench , o codigo main exibe uma interface  com o nome dos alunos , e  matricula , e ao lado de cada aluno , possui 3 caixas de seleção  , representando a presença , falta e a falta abonada , mas essas caixas de seleção não estão funcionando , eu quero que quando eu clique em qualquer uma , ela fica marcada, mas eu não sei o porque elas não funcionam , eu ja fiz esses códigos sem o banco de dados ,e elas funcionavam , mas quando implementei o banco , elas não funcionam mais;

 

package projeto;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import javax.swing.ButtonGroup;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.ListCellRenderer;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;

public class ListadeChamadaGUI extends JFrame {

    private JList<Aluno> listaAlunos;
    private DefaultListModel<Aluno> model;
    private Connection connection;
    private DefaultListModel<PresencaInfo> presencaModel;
    private Map<Aluno, PresencaInfo> presencasMap;

    public ListadeChamadaGUI() {
        setTitle("Lista de Chamada");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 400);
        setLocationRelativeTo(null);

        initComponents();
        setupDatabaseConnection();
        loadAlunosFromDatabase();
        addHeaderLabels();
    }

    private void initComponents() {
        model = new DefaultListModel<>();
        listaAlunos = new JList<>(model);
        listaAlunos.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        listaAlunos.setCellRenderer(new AlunoListCellRenderer());

        presencaModel = new DefaultListModel<>();
        presencasMap = new HashMap<>();

        getContentPane().add(listaAlunos, BorderLayout.CENTER);
    }

    private void setupDatabaseConnection() {
        String jdbcUrl = "jdbc:mysql://localhost:3306/localhost";
        String username = "root";
        String password = "nefertiti12345";

        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(jdbcUrl, username, password);
            System.out.println("Conexão com o banco de dados estabelecida com sucesso!");
        } catch (ClassNotFoundException e) {
            System.err.println("Driver do MySQL não encontrado!");
            e.printStackTrace();
        } catch (SQLException e) {
            System.err.println("Erro ao conectar-se ao banco de dados: " + e.getMessage());
            e.printStackTrace();
        }
    }

    private void loadAlunosFromDatabase() {
        try {
            String sql = "SELECT matricula, nome FROM alunos";
            PreparedStatement statement = connection.prepareStatement(sql);
            ResultSet resultSet = statement.executeQuery();

            while (resultSet.next()) {
                int matricula = resultSet.getInt("matricula");
                String nome = resultSet.getString("nome");

                Aluno aluno = new Aluno(matricula, nome);
                model.addElement(aluno);

                PresencaInfo presencaInfo = new PresencaInfo();
                presencaModel.addElement(presencaInfo);
                presencasMap.put(aluno, presencaInfo);

                System.out.println("Aluno adicionado: " + aluno);
            }

            resultSet.close();
            statement.close();
        } catch (SQLException e) {
            System.err.println("Erro ao carregar alunos do banco de dados: " + e.getMessage());
            e.printStackTrace();
        }
    }

    private void addHeaderLabels() {
        JLabel cursoLabel = new JLabel("Curso: Ciência da Computação");
        JLabel professorLabel = new JLabel("Professor: Henrique Nogueira");

        JPanel headerPanel = new JPanel(new GridLayout(2, 1));
        headerPanel.setBackground(Color.LIGHT_GRAY);
        headerPanel.add(cursoLabel);
        headerPanel.add(professorLabel);

        getContentPane().add(headerPanel, BorderLayout.NORTH);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            ListadeChamadaGUI gui = new ListadeChamadaGUI();
            gui.setVisible(true);
        });
    }

    private class AlunoListCellRenderer implements ListCellRenderer<Aluno> {

        private JPanel panel;
        private JLabel labelNome;
        private JRadioButton radioPresenca;
        private JRadioButton radioFalta;
        private JRadioButton radioAbonada;
        private ButtonGroup buttonGroup;

        public AlunoListCellRenderer() {
            panel = new JPanel();
            panel.setLayout(new GridLayout(1, 4));

            labelNome = new JLabel();
            radioPresenca = new JRadioButton("Presença");
            radioFalta = new JRadioButton("Falta");
            radioAbonada = new JRadioButton("Abonada");

            buttonGroup = new ButtonGroup();
            buttonGroup.add(radioPresenca);
            buttonGroup.add(radioFalta);
            buttonGroup.add(radioAbonada);

            panel.add(labelNome);
            panel.add(radioPresenca);
            panel.add(radioFalta);
            panel.add(radioAbonada);
        }

        @Override
        public Component getListCellRendererComponent(JList<? extends Aluno> list, Aluno aluno, int index,
                boolean isSelected, boolean cellHasFocus) {
            labelNome.setText(aluno.getNome());

            PresencaInfo presencaInfo = presencasMap.get(aluno);
            radioPresenca.setSelected(presencaInfo.isPresenca());
            radioFalta.setSelected(presencaInfo.isFalta());
            radioAbonada.setSelected(presencaInfo.isAbonada());

            return panel;
        }
    }
}

 

package projeto;

public class Aluno {
    private int matricula;
    private String nome;
    private PresencaInfo presencaInfo;

    public Aluno(int matricula, String nome) {
        this.matricula = matricula;
        this.nome = nome;
        this.presencaInfo = new PresencaInfo();
    }

    public int getMatricula() {
        return matricula;
    }

    public String getNome() {
        return nome;
    }

    public PresencaInfo getPresencaInfo() {
        return presencaInfo;
    }

    @Override
    public String toString() {
        return nome;
    }
}

 

package projeto;

import java.awt.Component;
import java.awt.GridLayout;
import javax.swing.ButtonGroup;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.ListCellRenderer;

public class AlunoListCellRenderer extends JPanel implements ListCellRenderer<Aluno> {

    private JLabel labelNome;
    private JRadioButton radioPresenca;
    private JRadioButton radioFalta;
    private JRadioButton radioAbonada;
    private ButtonGroup buttonGroup;

    public AlunoListCellRenderer() {
        setLayout(new GridLayout(1, 4));
        labelNome = new JLabel();
        radioPresenca = new JRadioButton("Presença");
        radioFalta = new JRadioButton("Falta");
        radioAbonada = new JRadioButton("Abonada");
        buttonGroup = new ButtonGroup();

        buttonGroup.add(radioPresenca);
        buttonGroup.add(radioFalta);
        buttonGroup.add(radioAbonada);

        add(labelNome);
        add(radioPresenca);
        add(radioFalta);
        add(radioAbonada);
    }

    @Override
    public Component getListCellRendererComponent(JList<? extends Aluno> list, Aluno aluno, int index,
            boolean isSelected, boolean cellHasFocus) {
        labelNome.setText(aluno.getNome());

        PresencaInfo presencaInfo = aluno.getPresencaInfo();
        radioPresenca.setSelected(presencaInfo.isPresenca());
        radioFalta.setSelected(presencaInfo.isFalta());
        radioAbonada.setSelected(presencaInfo.isAbonada());

        return this;
    }
}

 

package projeto;

import javax.swing.JRadioButton;

public class PresencaInfo {
    private boolean presenca;
    private boolean falta;
    private boolean abonada;
    private JRadioButton radioButton;

    public boolean isPresenca() {
        return presenca;
    }

    public void setPresenca(boolean presenca) {
        this.presenca = presenca;
    }

    public boolean isFalta() {
        return falta;
    }

    public void setFalta(boolean falta) {
        this.falta = falta;
    }

    public boolean isAbonada() {
        return abonada;
    }

    public void setAbonada(boolean abonada) {
        this.abonada = abonada;
    }

    public JRadioButton getRadioButton() {
        return radioButton;
    }

    public void setRadioButton(JRadioButton radioButton) {
        this.radioButton = radioButton;
    }
}
  • Solução
Postado

Faz muito tempo que eu não mexo com Swing, mas pelos testes que eu fiz aqui parece que o modelo da tabela está errado. Como se todos os elementos ficassem dentro de uma única célula, por isso não está funcionando.

 

Replique esse teste, adicione essas linhas de código:

if (matricula == 1) {
    // Adicionado apenas para teste.
    aluno.getPresencaInfo().setFalta(true);
}

dentro do método loadAlunosFromDatabase da classe ListadeChamadaGUI. Mude a condição do if para um valor que você tem certeza que existe no banco de dados.

 

O método deve ficar assim:

private void loadAlunosFromDatabase() {
    try {
        String sql = "SELECT matricula, nome FROM alunos";
        PreparedStatement statement = connection.prepareStatement(sql);
        ResultSet resultSet = statement.executeQuery();

        while (resultSet.next()) {
            int matricula = resultSet.getInt("matricula");
            String nome = resultSet.getString("nome");

            Aluno aluno = new Aluno(matricula, nome);
            model.addElement(aluno);

            if (matricula == 1) {
                // Adicionado apenas para teste.
                aluno.getPresencaInfo().setFalta(true);
            }

            PresencaInfo presencaInfo = new PresencaInfo();
            presencaModel.addElement(presencaInfo);
            presencasMap.put(aluno, presencaInfo);

            System.out.println("Aluno adicionado: " + aluno);
        }

        resultSet.close();
        statement.close();
    } catch (SQLException e) {
        System.err.println("Erro ao carregar alunos do banco de dados: " + e.getMessage());
        e.printStackTrace();
    }
}

 

Essa mudança deveria fazer com que apenas um aluno (o escolhido através da matricula) tivesse com o JRadioButton de falta marcado, porém todos os alunos são afetados. Isso mostra que todos os alunos estão sendo tratados como um único item.

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!