2017-07-27 5 views
1

Je travaille sur une application de projet qui devrait afficher les détails X509certificates dans un TableView. Les fichiers de certificats sont codés en DER et sont chargés à partir d'un dossier spécifique de l'ordinateur client. Quand il clique sur l'icône du disque dur dans la fenêtre de l'application, j'appelle la fonction handleHDD() du contrôleur pour charger les certificats et afficher leurs détails sur le TabeView.vue de la table n'affiche pas les données javafx

Voici le code de la fonction handleHDD() de mon contrôleur:

@FXML 
private void handleHDD() throws CertificateException, IOException, NoSuchProviderException{ 
    String userDir = System.getProperty("user.home"); 
    File folder = new File(userDir +"\\Desktop\\Certificate_Folder"); 
    FilenameFilter filter = new MyFileFilter(); 

    File[] certificates = folder.listFiles(filter); 

    ObservableList<CertificateModel> data = FXCollections.observableArrayList(); 
    String columnHeader[] = {"Nom","Version","N°série","Algorithme de signature","Emetteur","Valide à partir de","Valide jusqu'au","Objet","Clé publique"}; 
    if (certificates!=null){ 
     int sizeColumns = 9; 

     for (File file : certificates){ 
      if(file.isFile()){ 
      try{ 

      CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
      FileInputStream input = new FileInputStream(file); 

      X509Certificate cert = (X509Certificate)cf.generateCertificate(input); 

      for (int j = 0; j < sizeColumns; j++) { 
       TableColumn<CertificateModel, String> col = new TableColumn(); 
       col.setText(columnHeader[j]); 
       col.setMinWidth(200); 

       col.setCellValueFactory(new PropertyValueFactory<CertificateModel, String>(columnHeader[j])); 
       table.getColumns().addAll(col); 

      } 

      data.add(new CertificateModel(file.getName().replace(".der", ""), cert.getVersion(),cert.getSerialNumber().toString(16), cert.getSigAlgName(), cert.getIssuerDN().toString(), cert.getNotBefore(), cert.getNotAfter(), cert.getSubjectDN().toString(), cert.getPublicKey().toString())); 
      table.setItems(data); 
      }catch (IOException e){ 
       e.printStackTrace(); 
      } 
      } 

      } 

     } 
    } 

Et il y a ma classe CertificateModel.java:

public class CertificateModel { 

private String nom; 
private int version; 
private String numserie; 
private String algosign; 
private String emetteur; 
private Date validfrom; 
private Date validto; 
private String objet; 
private String clepub; 

public CertificateModel(String nom, int type, String numserie, String algosign, String emetteur, Date validfrom, Date validto, String objet, String clepub) { 
    this.nom = nom; 
    this.version = type; 
    this.numserie = numserie; 
    this.algosign = algosign; 
    this.emetteur = emetteur; 
    this.validfrom = validfrom; 
    this.validto = validto; 
    this.objet = objet; 
    this.clepub = clepub; 
} 

public void setNom(String nom) { 
    this.nom = nom; 
} 

public void setType(int type) { 
    this.version = type; 
} 

public void setNumserie(String numserie) { 
    this.numserie = numserie; 
} 

public void setAlgosign(String algosign) { 
    this.algosign = algosign; 
} 

public void setEmetteur(String emetteur) { 
    this.emetteur = emetteur; 
} 

public void setValidfrom(Date validfrom) { 
    this.validfrom = validfrom; 
} 

public void setValidto(Date validto) { 
    this.validto = validto; 
} 

public void setObjet(String objet) { 
    this.objet = objet; 
} 

public void setClepub(String clepub) { 
    this.clepub = clepub; 
} 

private static final Logger LOG = Logger.getLogger(CertificateModel.class.getName()); 

public String getNom() { 
    return nom; 
} 

public int getType() { 
    return version; 
} 

public String getNumserie() { 
    return numserie; 
} 

public String getAlgosign() { 
    return algosign; 
} 

public String getEmetteur() { 
    return emetteur; 
} 

public Date getValidfrom() { 
    return validfrom; 
} 

public Date getValidto() { 
    return validto; 
} 

public String getObjet() { 
    return objet; 
} 

public String getClepub() { 
    return clepub; 
} 

public static Logger getLOG() { 
    return LOG; 
} 

}

Quand je visite mon code en mode débogage , je peux voir toutes mes données à l'intérieur des variables mais le tableau est toujours vide.

Aidez s'il vous plaît! Si vous savez exactement qu'il y a 9 colonnes mieux pour créer une colonne séparée pour chacun d'eux au lieu de les créer dans une boucle

Répondre

1

Vous pouvez donc les publier dans un fichier .fxml. Ensuite, vous devez faire quelques petites choses:

  • refactor votre classe modèle, et y ajouter Property -s pour les valeurs que vous voulez afficher dans la table au lieu d'objets simples, comme:

    private String nom; ->private StringProperty nom; 
    private int version; -> private IntegerProperty version 
    . . . 
    private Date validfrom; -> private ObjectProperty<Date> validfrom; 
    . . . 
    

    puis getters pour eux.

  • définir la cellValueFactory pour chaque colonne de cette façon:

    nomColumn.setCellValueFactory(data -> data.getValue().nomProperty()); 
    

    Ensuite, il devrait fonctionner.

Si vous utilisez cette méthode, votre code sera plus compréhensible et plus clair, et vous pourrez voir où cela se passe.