2017-07-27 87 views
1

我正在处理应在TableView中显示X509certificates详细信息的项目应用程序。证书文件是DER编码并从客户端计算机的特定文件夹加载。当他点击应用程序窗口中的硬盘图标时,我打电话给控制器的handleHDD()函数加载证书并在TabeView上显示其详细信息。表视图不显示数据javafx

下面是函数handleHDD()从我的控制器代码:

@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(); 
      } 
      } 

      } 

     } 
    } 

而且还有我的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; 
} 

}

当我在调试模式下检查我的代码,我可以在变量内看到所有数据,但tableview仍然是空的。

请帮忙!

回答

1

如果您确切知道有9列更好地为每个列创建单独的列,而不是在循环中创建它们。所以你可以在.fxml文件中加入广告。然后你要做的几件事情:

  • 重构你的模型类,并添加有Property -s您要在表格中,而不是简单的对象,以显示这些值,如:

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

    然后为他们获得。

  • 设置cellValueFactory为每列是这样的:

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

    那么它应该工作。

如果您使用这种方式,您的代码将更加难以理解,并且清晰,并且您可以看到发生了什么。