Estes arquivos não sofrem alterações do projeto em Explicando o Projeto CRUD Estudante em JavaFX
Este arquivo já existia no projeto em Explicando o Projeto CRUD Estudante em JavaFX e sofre alterações para que inclua a delegação da persistência de dados para o controller.
// Esta é a classe com a tela/cena da interface das operações do CRUD de Estudante
package View;
//Imports dos pacotes MVC
import Model.Estudante;
import Controller.EstudanteController;
// Imports JavaFX
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.layout.HBox;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
public class EstudanteCRUDView {
Label labelRGA, labelNome;
TextField textFieldRGA, textFieldNome;
Button botaoCadastrar, botaoAtualizar, botaoExcluir;
VBox vbox;
HBox barraBotoes;
Scene scene;
TableView<Estudante> tabelaEstudantes;
TableColumn<Estudante, String> colunaRGA, colunaNome;
Alert mensagemAlerta;
//Cria uma instância da classe controladora de Estudante
private EstudanteController estudanteController = new EstudanteController();
// Método construtor que irá inicializar todos os elementos de interface da tela
public EstudanteCRUDView(){
// Mensagem de Alerta do tipo WARNING e suas propriedades
mensagemAlerta = new Alert(Alert.AlertType.WARNING);
mensagemAlerta.setTitle("Mensagem de Alerta");
mensagemAlerta.setHeaderText(null);
// Labels - rótulos de texto
labelRGA = new Label("RGA:");
labelNome = new Label("Nome do(a) Estudante:");
// TextFields - campos de entrada de texto
textFieldRGA = new TextField();
textFieldRGA.setMaxWidth(100);
textFieldNome = new TextField();
textFieldNome.setMaxWidth(400);
// Buttons - botões
botaoCadastrar = new Button("Cadastrar Novo Estudante");
botaoAtualizar = new Button("Atualizar Estudante");
botaoExcluir = new Button("Excluir Estudante");
// HBox - caixa vertical contendo os botões CRUD
barraBotoes = new HBox(botaoCadastrar, botaoAtualizar, botaoExcluir);
barraBotoes.setSpacing(10);
barraBotoes.setAlignment(Pos.CENTER);
// TableView - tabela contendo os dados de Estudante
tabelaEstudantes = new TableView<>();
//TableColumns - colunas da tabela e suas propriedades
colunaRGA = new TableColumn<>("RGA");
colunaRGA.setPrefWidth(164.0);
colunaRGA.setCellValueFactory(cellData -> cellData.getValue().RGAProperty());
colunaNome = new TableColumn<>("Nome");
colunaNome.setPrefWidth(485.0);
colunaNome.setCellValueFactory(cellData -> cellData.getValue().nomeProperty());
// Carrega as colunas na tabela
tabelaEstudantes.getColumns().addAll(colunaRGA, colunaNome);
atualizarTabela(); // Chama o método que carrega a tabela com os dados do arquivo CSV
// Listener para carregar as informações da linha selecionada na tabela para as caixas de texto
tabelaEstudantes.getSelectionModel().selectedItemProperty().addListener((obs, oldSelection, newSelection) -> {
if (newSelection != null) {
textFieldNome.setText(newSelection.getNome());
textFieldRGA.setText(newSelection.getRGA());
}
});
// Ações dos botões das operações de CRUD de Estudante na interface
botaoCadastrar.setOnAction(new EventHandler<ActionEvent>() { // Cadastrar Estudante
@Override
public void handle(ActionEvent e) {
Estudante estudante = new Estudante(textFieldRGA.getText(), textFieldNome.getText()); // Cria um estudante a partir dos dados das caixas de texto
estudanteController.cadastrarEstudante(estudante); // Chama o método de cadastro da controladora de Estudante
atualizarTabela(); // atualiza a tabela com os dados do arquivo CSV
limparTextFields(); // Limpa caixas de texto
}
});
botaoAtualizar.setOnAction(new EventHandler<ActionEvent>() { // Atualizar Estudante
@Override
public void handle(ActionEvent e) {
int i = tabelaEstudantes.getSelectionModel().getSelectedIndex(); // Pega a posição da linha selecionada da tabela
Estudante estudante = new Estudante(textFieldRGA.getText(), textFieldNome.getText()); // Cria um estudante a partir dos dados das caixas de texto
estudanteController.atualizarEstudante(i, estudante); // Chama o método de atualização da controladora de Estudante para a posição i da tabela
atualizarTabela(); // atualiza a tabela com os dados do arquivo CSV
limparTextFields(); // Limpa caixas de texto
}
});
botaoExcluir.setOnAction(new EventHandler<ActionEvent>() { // Excluir Estudante
@Override
public void handle(ActionEvent e) {
if (textFieldNome.getText().isBlank() || textFieldRGA.getText().isBlank()) {
mensagemAlerta.setContentText("Estudante não encontrado(a)!"); // Exemplo de mensagem de alerta - você pode criar outras!
mensagemAlerta.showAndWait();
} else {
Estudante estudante = tabelaEstudantes.getSelectionModel().getSelectedItem(); // Cria um estudante a partir dos dados linha selecionada na tabela
estudanteController.excluirEstudante(estudante); // Chama o método de exclusão da controladora de Estudante
atualizarTabela(); // atualiza a tabela com os dados do arquivo CSV
limparTextFields(); // Limpa caixas de texto
}
}
});
// VBox - caixa vertical que contém todos os elementos da tela/cena e suas propriedades
vbox = new VBox(labelRGA, textFieldRGA, labelNome, textFieldNome, barraBotoes, tabelaEstudantes);
vbox.setSpacing(10);
vbox.setAlignment(Pos.CENTER);
scene = new Scene(vbox, 650, 500); // Neste caso a VBox está funcionando como o layout da telan/cena
}
public Scene getScene(){ // Método que retorna a tela/cena para ser usada no palco
return this.scene;
}
public void limparTextFields(){ // Método para limpar as caixas de texto
textFieldRGA.clear();
textFieldNome.clear();
}
private void atualizarTabela() { // Método para atualizar a tabela com os dados do arquivo CSV
ObservableList<Estudante> listaDadosEstudantes = estudanteController.getListaDadosEstudantes();
tabelaEstudantes.setItems(listaDadosEstudantes);
}
}
// Esta é a classe controladora das operações do CRUD de Estudante. Ela usa o modelo de Estudante para manipular os dados e persistir no arquivo CSV via o gerenciador de dados CSVHandler.
package Controller;
//Imports dos pacotes MVC
import Model.Estudante;
import Model.CSVHandler;
// Imports JavaFX
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
// Outros imports
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class EstudanteController {
private ObservableList<Estudante> listaDadosEstudantes; // Cria uma lista de dados do tipo Estudante
public CSVHandler CSVHandler; // Cria uma instância do gerenciador de dados CSVHandler
public EstudanteController() {
CSVHandler = new CSVHandler(); // Instancia o gerenciador de dados CSVHandler
listaDadosEstudantes = FXCollections.observableArrayList(); // Cria uma lista observable de dados do tipo Estudante
CSVHandler.carregarDadosCSV(); // Carrega os dados do arquivo CSV
}
public ObservableList<Estudante> getListaDadosEstudantes() { // Obtém a lista de dados do tipo Estudante
return listaDadosEstudantes;
}
public void cadastrarEstudante(Estudante estudante) { // Cadastra um novo estudante na lista de dados
listaDadosEstudantes.add(estudante);
CSVHandler.salvarDadosCSV(); // Salva os dados no arquivo CSV
}
public void excluirEstudante(Estudante estudante) { // Exclui um estudante da lista de dados
listaDadosEstudantes.remove(estudante);
CSVHandler.salvarDadosCSV(); // Salva os dados no arquivo CSV
}
public void atualizarEstudante(int i, Estudante estudante) { // Atualiza um estudante da lista de dados
listaDadosEstudantes.set(i, estudante);
CSVHandler.salvarDadosCSV(); // Salva os dados no arquivo CSV
}
}
Este código em Java implementa o controlador das operações CRUD (Create, Read, Update, Delete) para a classe Estudante, utilizando a estrutura MVC (Model-View-Controller) e interagindo com um arquivo CSV para persistência de dados através do CSVHandler.
Atributo listaDadosEstudantes: Esse atributo é uma lista observável (ObservableList) de objetos do tipo Estudante. O uso de ObservableList facilita a sincronização automática dos dados com a interface gráfica do JavaFX, possibilitando a exibição e atualização dinâmica dos dados.
Atributo CSVHandler: A classe CSVHandler é responsável por carregar e salvar os dados dos estudantes em um arquivo CSV. Aqui, o controlador cria uma instância de CSVHandler e a utiliza para persistir os dados ao cadastrar, atualizar ou excluir estudantes.
No construtor da classe, o CSVHandler é instanciado, a lista de estudantes é inicializada como uma lista observável, e o método carregarDadosCSV() é chamado para carregar os dados armazenados no arquivo CSV para a lista.
Método getListaDadosEstudantes(): Este método retorna a lista observável de estudantes. Esse método seria normalmente utilizado pela camada de visualização (View) para obter os dados e exibi-los.
Método cadastrarEstudante(Estudante estudante): Esse método adiciona um novo objeto Estudante à lista de estudantes e, em seguida, salva os dados atualizados no arquivo CSV chamando o método salvarDadosCSV() da classe CSVHandler.
Método excluirEstudante(Estudante estudante): Este método remove um estudante da lista de estudantes, e então salva as alterações no arquivo CSV.
Método atualizarEstudante(int i, Estudante estudante): Esse método substitui um objeto Estudante específico (usando o índice i da lista) e, assim como os outros métodos, salva os dados no arquivo CSV.
// Esta é a classe que permite manipular o arquivo CSV para apersistência de dados sem afetar o restante do código do projeto.
package Model;
public class CSVHandler {
private String arquivoCSV = "estudantes.csv"; // Nome do arquivo CSV
public void carregarDadosCSV() { // Método para carregar os dados do arquivo CSV
try (BufferedReader br = new BufferedReader(new FileReader(arquivoCSV))) {
String linha; // Variável para armazenar cada linha do arquivo CSV
while ((linha = br.readLine()) != null) { // Lê cada linha do arquivo CSV
String[] dados = linha.split(","); // Separa os dados da linha em um array de strings
if (dados.length == 2) { // Verifica se a linha tem exatamente dois campos separados por vírgula
listaDadosEstudantes.add(new Estudante(dados[0], dados[1])); // Adiciona um novo objeto Estudante à lista usando os dados da linha
}
}
br.close(); // Fecha o arquivo CSV
} catch (IOException e) { // Trata exceções de entrada/saída se houver
e.printStackTrace();
}
}
public void salvarDadosCSV() { // Método para salvar os dados do arquivo CSV
try (BufferedWriter bw = new BufferedWriter(new FileWriter(arquivoCSV))) {
for (Estudante estudante : listaDadosEstudantes) { // Percorre a lista de objetos Estudante
bw.write(estudante.getRGA() + "," + estudante.getNome()); // Escreve os dados do objeto Estudante no arquivo CSV
bw.newLine(); // Adiciona uma nova linha no arquivo CSV
}
bw.close(); // Fecha o arquivo CSV
} catch (IOException e) { // Trata exceções de entrada/saída se houver
e.printStackTrace();
}
}
}
Esse código em Java define uma classe CSVHandler que manipula um arquivo CSV para carregar e salvar dados de estudantes, sem afetar outras partes do projeto MVC.
A variável arquivoCSV guarda o nome do arquivo CSV onde os dados serão persistidos, neste caso, "estudantes.csv".
Este método lê dados de um arquivo CSV. Ele usa um BufferedReader para abrir e ler o arquivo linha por linha.
Cada linha do CSV é separada por vírgulas, e os valores são armazenados em um array de String chamado dados.
O método checa se a linha tem dois valores (presumivelmente, o identificador e o nome do estudante), e se sim, cria um novo objeto Estudante com esses valores, adicionando-o à lista listaDadosEstudantes.
Este método grava os dados de uma lista de objetos Estudante no arquivo CSV. Ele usa um BufferedWriter para escrever os dados no arquivo.
Para cada objeto Estudante na lista, os atributos RGA e Nome são concatenados com uma vírgula e escritos em uma linha separada no CSV.
Ambos os métodos (carregarDadosCSV e salvarDadosCSV) possuem blocos try-catch para capturar e tratar exceções de I/O (leitura e escrita de arquivos), como o IOException.