2017-07-27 21 views
1

X509certificatesの詳細をTableViewに表示するプロジェクトアプリケーションで作業しています。証明書ファイルはDERでエンコードされ、クライアントコンピュータの特定のフォルダから読み込まれます。彼がアプリケーションウィンドウでHDDアイコンをクリックすると、コントローラのhandleHDD()機能が呼び出され、証明書がロードされ、その詳細がTabeViewに表示されます。ここでテーブルビューにデータが表示されない

は私のコントローラから機能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()); 
    

    そして、それが動作するはずです。

この方法を使用している場合、コードは理解しやすく、明確になり、何が起こっているのかがわかります。

関連する問題