表视图不显示数据javafx

表视图不显示数据javafx,java,javafx,tableview,x509certificate,tablecolumn,Java,Javafx,Tableview,X509certificate,Tablecolumn,我正在开发一个项目应用程序,它应该在表视图中显示X509certificates详细信息。证书文件采用DER编码,并从客户端计算机的特定文件夹加载。当他单击应用程序窗口中的HDD图标时,我调用控制器的handleHDD()函数来加载证书并在选项卡查看中显示其详细信息 以下是来自我的控制器的函数handleHDD()的代码: @FXML private void handleHDD() throws CertificateException, IOException, NoSuchProvider

我正在开发一个项目应用程序,它应该在
表视图中显示X509certificates详细信息。证书文件采用DER编码,并从客户端计算机的特定文件夹加载。当他单击应用程序窗口中的HDD图标时,我调用控制器的
handleHDD()
函数来加载证书并在
选项卡查看中显示其详细信息

以下是来自我的控制器的函数
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();
            }
            }

            }

        }
    }
}

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


救命啊

如果您确切地知道有9个列,那么最好为每个列创建一个单独的列,而不是在循环中创建它们。因此,您可以将它们添加到
.fxml
文件中。然后你必须做几件事:

  • 重构您的模型类,并在那里为您希望在表中显示的值而不是简单对象添加
    属性
    -s,如:

    private String nom; ->private StringProperty nom;
    private int version; -> private IntegerProperty version
    . . .
    private Date validfrom; -> private ObjectProperty<Date> validfrom;
    . . .
    
    那么它应该会起作用

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

private String nom; ->private StringProperty nom;
private int version; -> private IntegerProperty version
. . .
private Date validfrom; -> private ObjectProperty<Date> validfrom;
. . .
nomColumn.setCellValueFactory(data -> data.getValue().nomProperty());