Javafx tableview不会在所有列中显示数据

好吧,几个星期以来,新的Java,但已编程了30年。 下面的代码执行,但只有第一列显示任何东西。 数据对象显示了多行数据,并填充了数据字段。我确定我错过了一些东西,并在这里查看了类似的问题。

APVoucher_batchgridController.java

import java.net.URL; import java.util.ResourceBundle; import javafx.event.ActionEvent; import javafx.fxml.Initializable; import javafx.fxml.FXML; import javafx.scene.control.TableView; import javafx.scene.input.MouseEvent; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.logging.Level; import java.util.logging.Logger; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.control.TableColumn; import javafx.scene.control.cell.PropertyValueFactory; /** * FXML Controller class * * @author kmitchell */ public class APVoucher_batchgridController implements Initializable { public TableView tblMainList; public TableColumn colDateEntered; public TableColumn colCreatedBy; public TableColumn colDescription; /** * Initializes the controller class. */ @Override public void initialize(URL url, ResourceBundle rb) { } @FXML public void opentables(ActionEvent event) { Object forName = null; Connection conn = null; Statement stmt = null; ResultSet rs = null; colDateEntered.setCellValueFactory(new PropertyValueFactory<sresult, String>("DateEntered")); colDescription.setCellValueFactory(new PropertyValueFactory<sresult, String>("cDesc")); colCreatedBy.setCellValueFactory(new PropertyValueFactory<sresult, String>("CreatedBy")); try { // load the driver into memory forName = Class.forName("jstels.jdbc.dbf.DBFDriver2"); } catch (ClassNotFoundException ex) { Logger.getLogger(APVoucher_batchgridController.class.getName()).log(Level.SEVERE, null, ex); } try { conn = DriverManager.getConnection("jdbc:jstels:dbf:e:\\keystone-data\\keyfund\\seymour\\keyfund.dbc"); } catch (SQLException ex) { Logger.getLogger(APVoucher_batchgridController.class.getName()).log(Level.SEVERE, null, ex); } if (conn != null) { try { stmt = conn.createStatement(); } catch (SQLException ex) { Logger.getLogger(APVoucher_batchgridController.class.getName()).log(Level.SEVERE, null, ex); } if (stmt != null) { // execute a query try { ObservableList<Object> data = FXCollections.observableArrayList(); rs = stmt.executeQuery("SELECT denteredon, cdesc, ccreatedby FROM apvbatch WHERE ldeleted = false ORDER BY denteredon DESC"); while (rs.next()) { String enteredon = rs.getString("denteredon"); String desc = rs.getString("cdesc"); String createdby = rs.getString("ccreatedby"); sresult row = new sresult(createdby, enteredon, desc); data.add(row); } tblMainList.setItems(data); tblMainList.setVisible(true); } catch (SQLException ex) { Logger.getLogger(APVoucher_batchgridController.class.getName()).log(Level.SEVERE, null, ex); } } } } public class sresult { private String DateEntered; private String EnteredBy; private String cDesc; public sresult(String T, String d, String c) { this.EnteredBy = T; this.DateEntered = d; this.cDesc = c; } public String getEnteredBy() { return EnteredBy; } public void setEnteredBy(String T) { EnteredBy = T; } public String getDateEntered() { return DateEntered; } public void setDateEntered(String d) { DateEntered = d; } public String getcDesc() { return cDesc; } public void setcDesc(String c) { cDesc = c; } } } 

和APVoucher_batchgrid.fxml

 <?xml version="1.0" encoding="UTF-8"?> <?import java.lang.*?> <?import java.net.*?> <?import java.util.*?> <?import javafx.geometry.*?> <?import javafx.scene.*?> <?import javafx.scene.control.*?> <?import javafx.scene.layout.*?> <?import javafx.scene.text.*?> <AnchorPane id="AnchorPane" fx:id="batchlistform" prefHeight="400.0" prefWidth="600.0" styleClass="mainFxmlClass" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="keystone.APVoucher_batchgridController"> <children> <BorderPane layoutX="0.0" layoutY="0.0" prefHeight="400.0" prefWidth="600.0"> <center> <AnchorPane prefHeight="-1.0" prefWidth="-1.0"> <children> <Pane layoutX="0.0" layoutY="0.0" prefHeight="53.0" prefWidth="580.0"> <children> <Label layoutX="7.0" layoutY="9.0" prefWidth="202.0" text="AP Vouchers Batch List"> <font> <Font name="System Bold" size="14.0" /> </font> </Label> <Button fx:id="btnClose" cancelButton="true" layoutX="513.0" layoutY="27.0" mnemonicParsing="false" text="Close" /> <Button id="btnClose" fx:id="apvRefresh" cancelButton="true" layoutX="185.0" layoutY="27.0" mnemonicParsing="false" onAction="#opentables" text="Refresh" /> </children> </Pane> <TableView fx:id="tblMainList" layoutX="0.0" layoutY="53.0" prefHeight="323.0" prefWidth="580.0"> <columns> <TableColumn maxWidth="5000.0" minWidth="10.0" prefWidth="91.0" text="Date Entered" fx:id="colDateEntered" /> <TableColumn maxWidth="5000.0" minWidth="10.0" prefWidth="100.0" text="Created By" fx:id="colCreatedBy" /> <TableColumn maxWidth="5000.0" minWidth="10.0" prefWidth="261.0" text="Description" fx:id="colDescription" /> </columns> </TableView> </children> </AnchorPane> </center> <padding> <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" /> </padding> </BorderPane> </children> <stylesheets> <URL value="@apvoucher_batchgrid.css" /> </stylesheets> </AnchorPane> 

谢谢你的答案。 在不区分大小写的语言方面多年。 这对我来说是一个快速和肮脏的练习,以学习Java和最新的和最伟大的东西,或者我喜欢说新兴技术(NExT!)

对于任何查看答案的人来说,仍然没有完全知道,这里是使代码正常工作的变化。

 colDateEntered.setCellValueFactory(new PropertyValueFactory<sresult, String>("Denteredon")); colDescription.setCellValueFactory(new PropertyValueFactory<sresult, String>("CDesc")); colEnteredBy.setCellValueFactory(new PropertyValueFactory<sresult, String>("Ccreatedby")); public class sresult { private String Denteredon; private String Ccreatedby; private String CDesc; public sresult(String T, String d, String c) { this.Ccreatedby = T; this.Denteredon = d; this.CDesc = c; } public String getCcreatedby() { return Ccreatedby; } public void setCreatedby(String T) { Ccreatedby = T; } public String getDenteredon() { return Denteredon; } public void setDenteredon(String d) { Denteredon = d; } public String getCDesc() { return CDesc; } public void setCDesc(String c) { CDesc = c; } } } 

这个问题实际上是一个复制: Javafx PropertyValueFactory不填充Tableview ,但我会专门解决您的具体情况,所以很明显。

背景

PropertyValueFactory使用reflection来确定获取和设置数据值的方法,以及从模型类中检索可绑定的属性。 接下来的模式是:

 PropertyValueType getName() void setName(PropertyValueType value) PropertyType nameProperty() 

其中“name”是在PropertyValueFactory构造函数中指定的string。 getter和setter中的属性名称的第一个字母是大写的(通过java bean命名约定)。

为什么你的应用程序不起作用

你有这三个expression式:

 new PropertyValueFactory<sresult, String>("DateEntered") new PropertyValueFactory<sresult, String>("cDesc") new PropertyValueFactory<sresult, String>("CreatedBy") 

对于您的示例属性,PropertyValueFactory将查找这些方法:

 "DateEntered" => getDateEntered() "cDesc" => getCDesc() "CreatedBy" => getCreatedBy() 

你在sresult课上有三个getter:

 getDateEntered() getcDesc() getEnteredBy() 

只有getDateEntered()将被PropertyValueFactory接收,因为这是sresult类中唯一定义的匹配方法。

忠告

如果您希望PropertyValueFactory中的reflection工作(另一种方法是不使用PropertyValueFactory,而是从头开始编写自己的单元工厂),则必须采用Java标准。

采用Java骆驼命名约定也使得Java开发人员更容易阅读代码。