处理从模型到控制器的observableArrayList

时间:2016-08-16 16:09:24

标签: model-view-controller tableview javafx-8

我是初学者,并没有成功将在网络上找到的解决方案应用到我的应用程序结构中。这是我的第一篇文章所以请宽容。
我有一个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");            
  }
}

}

1 个答案:

答案 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");            
  }
}