Olá a todos, eu estou correndo atras de umas dicas de CRUD em javaFX usando modelo MVC, mas com a view feita em FXML.
Estou com muita dificuldade de entender a parte do model que eu poderia utilizar.
Queria uma estrutura que fosse nesse estilo os package
Acesse esse link JavaFX Tutorial, tem um tutorial de CRUD com JavaFX, entretanto a persistência é feita em arquivos XML, mas já serve como base. Se quiser mudar o modelo de persistência para um Banco de Dados é bem simples. (Comecei a desenvolver em JavaFX por esse tutorial).
Outro exemplo: CRUD JFX com Hibernate - Esse usa BD e ainda com o visual do W8.
J
jeff021
Fala ai amigo vc teria um CRUD de JavaFX com JDBC, pois eu estou estudando com essa finalidade.
Minha dificuldade em fazer o projeto seria a ligação do model (bean, dao) com o controller.
Pois com property eu não consigo fazer ainda.
W
Wsscontador1 like
O modelo:
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */packagemodelEclispseJPAeAnnotations;importjava.io.Serializable;importjavax.persistence.Column;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.GenerationType;importjavax.persistence.Id;/** * * @author wssco */@Entity(name="contato")publicclassContatoimplementsSerializable{@Id@GeneratedValue(strategy=GenerationType.AUTO)privateintid;@Column(length=50,nullable=false)privateStringnome;@Column(length=20,nullable=false)privateStringfone;@Column(length=250)privateStringemail;publicContato(){}publicContato(intid,Stringnome,Stringfone,Stringemail){this.id=id;this.nome=nome;this.fone=fone;this.email=email;}/** * @return the id */publicintgetId(){returnid;}/** * @param id the id to set */publicvoidsetId(intid){this.id=id;}/** * @return the nome */publicStringgetNome(){returnnome;}/** * @param nome the nome to set */publicvoidsetNome(Stringnome){this.nome=nome;}/** * @return the fone */publicStringgetFone(){returnfone;}/** * @param fone the fone to set */publicvoidsetFone(Stringfone){this.fone=fone;}/** * @return the email */publicStringgetEmail(){returnemail;}/** * @param email the email to set */publicvoidsetEmail(Stringemail){this.email=email;}}
o CRUD fazendo a persistência:
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */packagecontroller;importjava.util.List;importjavax.persistence.EntityManager;importjavax.persistence.EntityManagerFactory;importjavax.persistence.EntityTransaction;importjavax.persistence.Persistence;importmodel.Contato;/** * * @author wssco */publicclassContatoController{privatefinalEntityManagerFactoryemf;privatefinalEntityManagerem;privatefinalEntityTransactiontx;publicContatoController(){emf=Persistence.createEntityManagerFactory("TemplusFXPU");em=emf.createEntityManager();tx=em.getTransaction();}publicvoidgravar(Contatoc){tx.begin();em.persist(c);em.flush();tx.commit();}publicvoidremover(Contatoc){tx.begin();em.remove(c);tx.commit();}publicList<Contato>lista(){tx.begin();List<Contato>list=em.createQuery("select c from contato c").getResultList();tx.commit();returnlist;}}
Agora a VIEW com JavaFX e SceneBuilder:
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */packagecontroller;importjava.net.URL;importjava.util.ResourceBundle;importjavafx.collections.FXCollections;importjavafx.collections.ObservableList;importjavafx.event.ActionEvent;importjavafx.fxml.FXML;importjavafx.fxml.Initializable;importjavafx.scene.control.Alert;importjavafx.scene.control.Button;importjavafx.scene.control.TableColumn;importjavafx.scene.control.TableView;importjavafx.scene.control.TextField;importjavafx.scene.control.cell.PropertyValueFactory;importmodel.Contato;/** * FXML Controller class * * @author wssco */publicclassFXMLContatoGuiControllerimplementsInitializable{privatefinalObservableList<Contato>dadosContato;privatefinalContatoControllercontatoController;publicFXMLContatoGuiController(){contatoController=newContatoController();dadosContato=FXCollections.observableArrayList(contatoController.lista());}@FXMLprivateTableViewcontatoTable;@FXMLprivateTableColumnidCol;@FXMLprivateTableColumnnomeCol;@FXMLprivateTableColumnfoneCol;@FXMLprivateTableColumnemailCol;@FXMLprivateTextFieldnomeTextField;@FXMLprivateTextFieldfoneTextField;@FXMLprivateTextFieldemailTextField;@FXMLprivateButtongravarButton;/** * Initializes the controller class. * * @param url * @param rb */@Overridepublicvoidinitialize(URLurl,ResourceBundlerb){preencherTabela();}@FXMLpublicvoideventGravarButtonClick(ActionEventevent){Contatoc=newContato();try{c.setNome(nomeTextField.getText());c.setFone(foneTextField.getText());c.setEmail(emailTextField.getText());contatoController.gravar(c);alert("Gravado com sucesso");}catch(Exceptionex){alert(ex.getMessage());}}publicvoidpreencherTabela(){idCol.setCellValueFactory(newPropertyValueFactory("Id"));nomeCol.setCellValueFactory(newPropertyValueFactory("Nome"));foneCol.setCellValueFactory(newPropertyValueFactory("Fone"));emailCol.setCellValueFactory(newPropertyValueFactory("Email"));contatoTable.setItems(dadosContato);}publicvoidalert(Stringmsg){Alertalert=newAlert(Alert.AlertType.INFORMATION);alert.setHeaderText(null);alert.setTitle("Mensagem");alert.setContentText(msg);alert.show();}}
a classe Main do JavaFX
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */packageview;importjava.io.IOException;importjavafx.application.Application;importjavafx.fxml.FXMLLoader;importjavafx.scene.Parent;importjavafx.scene.Scene;importjavafx.stage.Stage;/** * * @author wssco */publicclassMainAppextendsApplication{@Overridepublicvoidstart(StageprimaryStage)throwsIOException{Parentroot=FXMLLoader.load(getClass().getResource("FXMLContatoGui.fxml"));Scenescene=newScene(root);primaryStage.setTitle("Contato");primaryStage.setScene(scene);primaryStage.show();}/** * @param args the command line arguments */publicstaticvoidmain(String[]args){launch(args);}}
G
Gabriel_Marques1 like
Amigo, não tem mistério.
Você apenas precisa separar as camadas do MVC corretamente:
O controller apenas se comunica com a camada service, e o service se comunica com a camada dao.
Se precisar de algum objeto persisitdo no banco de dados, epenas faça a camada service abstrair da camada dao e mandar para o controller
Voce só precisa inicializar um objeto da camada service no controller para tal.
W
Wsscontador2 likes
Espero ter ajudado. O desenvolvimento da View foi feito com a criação da tela no SceneBuilder usando como controller a classe FXMLContatoGuiController para manipular a inicialização e a manipulação dos objetos.
J
Jesuino_Master1 like
Olá,
Eu postei um recentemente no blog APRENDENDO JAVAFX, veja: