我是初学者,并没有成功将在网络上找到的解决方案应用到我的应用程序结构中。这是我的第一篇文章所以请宽容。
我有一个Factory / DAO / Singleton模板来连接数据库
即使我刚刚实现了find函数,它也能正常工作。
然后,我想实现一个MVC模式 模型例如是名为“Fichier”的类。 FichierSQL使用这个类来填充“Fichier”的实例 视图由名为“FenFichier”的FXML文件提供。 Controller是名为“FenFichierController”的classe。 另一个类管理不同的视图,并命名为“LoginManager” 编辑:感谢@Jewelsea关于loginsession
的github代码正如在数据库查询所在的FichierSQL中一样,我认为它应该是实现observableArrayList的最佳位置。
问题:a无法从控制器访问此类的“getFichierList”方法以填充TableView。
您的评论也欢迎关于LoginManager类,因为我将有很多窗口需要管理,我不知道如何以完美的方式做到这一点。如果您需要更多代码段,请告诉我。
Fichier.class
public class Fichier {
private final IntegerProperty fichierID;
/** nom du fichier de mesure */
private final StringProperty nomFichier;
/** le fichier est-il un essai = 1 ? ou un OF = 0 (default) */
private final BooleanProperty isEssai;
/** date de création du fichier de mesure */
private final ObjectProperty<Date> dateCreation;
/** nom du client */
private final StringProperty client;
private static Date DATE_NULL = new Date(0);
/** création d'un fichier vide */
public Fichier() {
this(0,null,false,DATE_NULL,null);
}
/** création d'un fichier de mesure
* @param fid identification unique du fichier dans la BDD
* @param fichier nom du fichier de mesure
* @param ess essai = 1 ou OF = 0
* @param dtecreation date de création du fichier de mesure
* @param cli nom du client
*/
public Fichier(int fid, String fichier, Boolean ess, Date dtecreation, String cli ) {
this.fichierID = new SimpleIntegerProperty(fid);
this.nomFichier = new SimpleStringProperty(fichier);
this.isEssai = new SimpleBooleanProperty(ess);
this.dateCreation = new SimpleObjectProperty<Date>(dtecreation);
this.client = new SimpleStringProperty(cli);
}
/**
* renvoie le numéro unique de fichier
* @return fichierID
*/
public int getFichierID() {
return fichierID.get();
}
public IntegerProperty fichierIDProperty() {
return fichierID;
}
/**
* renvoie le nom du fichier de mesure
* @return nomFichier
*/
public String getNomFichier() {
return nomFichier.get();
}
/**
* modifie le nom du fichier de mesure
* @param newFichier
*/
public void setNomFichier(String newFichier) {
this.nomFichier.set(newFichier);
}
public StringProperty nomFichierProperty() {
return nomFichier;
}
/**
* renvoie si le fichier de mesure est un essai = True ou OF = False
* @return isEssai
*/
public Boolean getIsEssai() {
return isEssai.get();
}
/**
* modifie le type de fichier de mesure en essai = True ou OF = False
* @param newIsEssai
*/
public void setIsEssai(Boolean newIsEssai) {
this.isEssai.set(newIsEssai);
}
public BooleanProperty isEssaiProperty() {
return isEssai;
}
/**
* renvoie la date de creation du fichier de mesure
* @return dateCreation
*/
public Date getDateCreation() {
return dateCreation.get();
}
/**
* modifie la date de creation du fichier de mesure
* @param newDateCreation
*/
public void setDateCreation(Date newDateCreation) {
this.dateCreation.set(newDateCreation);
}
public ObjectProperty<Date> dateCreationProperty() {
return dateCreation;
}
/**
* renvoie le client
* @return client
*/
public String getClient() {
return client.get();
}
/**
* modifie le client
* @param newClient
*/
public void setClient(String newClient) {
this.client.set(newClient);
}
public StringProperty nomClientProperty() {
return client;
}
FichierSQL.class
public class FichierSQL extends DAO<Fichier> {
private ObservableList<Fichier> fichierList = FXCollections.observableArrayList();
public FichierSQL(Connection conn) {
super(conn);
}
public boolean create(Fichier obj) {
return false;
}
public boolean delete(Fichier obj) {
return false;
}
public boolean update(Fichier obj) {
return false;
}
public Fichier find(String nomFichier) {
Fichier fich = new Fichier();
try {
ResultSet result = this.connect
.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY)
.executeQuery("SELECT * FROM tb_fichier WHERE fichier LIKE '" + nomFichier + "'");
while (result.next())
fich = new Fichier(
result.getInt("fichierid"),
result.getString("fichier"),
result.getBoolean("isEssai"),
result.getDate("datecreation"),
result.getString("client")
);
fichierList.add(fich);
} catch (SQLException e) {
e.printStackTrace();
}
return fich;
}
public ObservableList<Fichier> getFichierList() {
return fichierList;
}
LoginManager.class
public class LoginManager {
private Scene scene;
private Stage stage;
private BorderPane fenMainLayout;
public LoginManager(Stage stage, Scene scene) {
this.scene = scene;
this.stage = stage;
}
/**
* Callback method invoked to notify that a user has been authenticated.
* Will show the main application screen.
*/
public void authenticated(String sessionID) {
showMainView(sessionID);
}
/**
* Callback method invoked to notify that a user has logged out of the main
* application. Will show the login application screen.
*/
public void logout() {
showLoginScreen();
}
public void showLoginScreen() {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("login.fxml"));
scene.setRoot((Parent) loader.load());
LoginController controller = loader.<LoginController> getController();
controller.initManager(this);
} catch (IOException ex) {
Logger.getLogger(LoginManager.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void showMainView(String sessionID) {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/applicationTelabFX/FenMain.fxml"));
fenMainLayout = (BorderPane) loader.load();
Scene scene = new Scene(fenMainLayout);
stage.setScene(scene);
stage.setWidth(800);
stage.setHeight(600);
FenMainController controller = loader.<FenMainController> getController();
controller.initSessionID(this, sessionID);
stage.setTitle("TestLL");
stage.show();
showFichierView();
} catch (IOException ex) {
Logger.getLogger(LoginManager.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void showFichierView() {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/applicationTelabFX/FenFichier.fxml"));
AnchorPane fichierView = (AnchorPane) loader.load();
fenMainLayout.setCenter(fichierView);
FenFichierController controller = loader.getController();
} catch (IOException ex) {
Logger.getLogger(LoginManager.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
FenFichierController.class
public class FenFichierController {
@FXML
private TableView<Fichier> fichierTable;
@FXML
private TableColumn<Fichier, Integer> fichierIDCol;
@FXML
private TableColumn<Fichier, String> fichierMesCol;
@FXML
private Label fichierIDLabel;
@FXML
private Label nomFichierLabel;
@FXML
private CheckBox isEssaiCB;
@FXML
private Label dateCreationLabel;
@FXML
private Label clientLabel;
/**
* The constructor.
* The constructor is called before the initialize() method.
*/
public FenFichierController() { }
/**
* Initializes the controller class. This method is automatically called
* after the fxml file has been loaded.
*/
@FXML
private void initialize() {
// Initialize the person table with the two columns.
fichierIDCol.setCellValueFactory(cellData -> cellData.getValue().fichierIDProperty().asObject());
fichierMesCol.setCellValueFactory(cellData -> cellData.getValue().nomFichierProperty());
fichierTable.setItems(getFichierList);
}
public ObservableList<Fichier> fichiersData;
public void creationData(){
fichiersData = FXCollections.observableArrayList();
try{
AbstractDAOFactory adf = AbstractDAOFactory.getFactory(AbstractDAOFactory.SQLSERVER_DAO_FACTORY);
DAO<Fichier> fichierDao = adf.getFichierDAO();
Fichier fich = fichierDao.find("%");
}
catch(Exception e){
e.printStackTrace();
System.out.println("Erreur de création des données");
}
}
}
答案 0 :(得分:1)
如果还没有,请将getFichierList()
方法提升为DAO
类(您可能希望将其重命名为更一般的方法,因为DAO
独立于Fichier
1}} class):
public abstract class DAO<T> {
public abstract ObservableList<T> getFichierList();
// ...
}
现在,您的FichierSQL
实施会覆盖此内容:
public class FichierSQL extends DAO<Fichier> {
// ...
@Override
public ObservableList<Fichier> getFichierList() {
return fichierList;
}
// ...
}
现在在控制器中你可以做到
public void creationData(){
try{
AbstractDAOFactory adf = AbstractDAOFactory.getFactory(AbstractDAOFactory.SQLSERVER_DAO_FACTORY);
DAO<Fichier> fichierDao = adf.getFichierDAO();
Fichier fich = fichierDao.find("%");
fichiersData = fichierDao.getFichierList();
}
catch(Exception e){
e.printStackTrace();
System.out.println("Erreur de création des données");
}
}
或者,当然,只需将AbstractDAOFactory.getFichierDAO()
的返回类型设为FichierSQL
,这样就可以了
public void creationData(){
try{
AbstractDAOFactory adf = AbstractDAOFactory.getFactory(AbstractDAOFactory.SQLSERVER_DAO_FACTORY);
FichierDAO fichierDao = adf.getFichierDAO();
Fichier fich = fichierDao.find("%");
fichiersData = fichierDao.getFichierList();
}
catch(Exception e){
e.printStackTrace();
System.out.println("Erreur de création des données");
}
}