2016-08-16 42 views
0

我是一名初學者,無法成功地將在網上找到的解決方案應用到我的應用程序結構中。這是我的第一篇文章,因此請寬大處理。
我有一個Factory/DAO/Singleton模板來連接數據庫。
即使我現在剛剛實現查找功能,它也能正常工作。處理從模型到控制器的observableArrayList

然後,我想實現一個MVC模式。
模型是例如名爲「Fichier」的類。這個類被FichierSQL用來填充「Fichier」的實例。
視圖由名爲「FenFichier」的FXML文件提供。 控制器是名爲「FenFichierController」的類。 另一個類管理不同的視圖,並命名爲「LoginManager」。
編輯:感謝@Jewelsea對GitHub的代碼約loginsession

由於這是在FichierSQL該數據庫查詢是,我認爲它應該在這裏實現observableArrayList的最佳場所。
問題是,無法從控制器訪問此類的「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。類

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

@James_D:你或者想法已經在其他類中實現,如下所示:public DAO getFichierDAO(){return new fichierSQL(conn);}所以我認爲我誤解了一些東西。應該是DAO ??? – cosmo

+0

我的意思是將該方法的返回類型改爲'FichierSQL'。所以你可以直接調用現有的'getFichierList()'方法而不用改變抽象DAO類的API(或者將會變得醜陋)。 –

+0

某些內部類必須修改specfics基本對象(如「fichier」)而無需用戶交互,但需要爲用戶顯示更改。所以,這就是爲什麼我要感謝基本的工作。你給我寶貴的幫助。非常感謝。最後的評論,因爲我顯示一個警告消息:這不是聊天大聲笑。 Thx – cosmo

回答

1

如果不是已經存在,促進getFichierList()方法將DAO類(您可能需要將其重命名爲更普遍的,因爲DAO獨立於Fichier類) :

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");    
    } 
} 
+0

不錯!在我的代碼中進行一些調整後,第一個解決方案就可以了。謝謝你:) – cosmo

+0

YW。如果回答您的問題,請將答案標記爲正確。 –

+0

你是否認爲在抽象類中使這個ObservableList公開是個問題? – cosmo