我正在尝试使用数据库中的数据填充JavaFX TableView,并且我收到此错误,我无法解决,或者找到一个asnwer在线。
我有几个项目在JDK 8上工作,我从来没有在执行类似任务时遇到此错误,但我最近使用JDK 9的项目给了我这个错误,不知道问题出在哪里。两个项目的代码完全相同。
此外,我想指出,此代码成功地从数据库中检索数据,但在表格中显示时会出现错误。
CODE
FXML:
<TableView fx:id="table" layoutX="46.0" layoutY="83.0" prefHeight="458.0" prefWidth="680.0">
<columns>
<TableColumn fx:id="column_code" prefWidth="100" text="Item Code" />
<TableColumn fx:id="column_name" prefWidth="200" text="Item Name" />
<TableColumn fx:id="column_date" prefWidth="100" text="Order Date" />
<TableColumn fx:id="column_quantity" prefWidth="80" text="Quantity" />
<TableColumn fx:id="column_cost" prefWidth="100" text="Order Cost" />
<TableColumn fx:id="column_status" prefWidth="100" text="Order Status" />
</columns>
</TableView>
控制器:
public class StockController implements Initializable {
static Connection con = null;
static PreparedStatement pst = null;
static Statement stmt = null;
static ResultSet rs;
private ObservableList<Stock> data
@FXML private TableView<Stock> table;
@FXML private TableColumn<?, ?> column_code;
@FXML private TableColumn<?, ?> column_name;
@FXML private TableColumn<?, ?> column_date;
@FXML private TableColumn<?, ?> column_quantity;
@FXML private TableColumn<?, ?> column_cost;
@FXML private TableColumn<?, ?> column_status;
@Override
public void initialize(URL url, ResourceBundle rb){
con = sample.Database.DBConnection.makeConnection();
data = FXCollections.observableArrayList();
try{
stmt = con.createStatement();
} catch (Exception e){
System.out.println("error connecting to db");
}
setCellTable();
loadDataFromDB();
}
public void setCellTable(){
column_code.setCellValueFactory(new PropertyValueFactory<>("itemCode"));
column_name.setCellValueFactory(new PropertyValueFactory<>("itemName"));
column_date.setCellValueFactory(new PropertyValueFactory<>("orderDate"));
column_quantity.setCellValueFactory(new PropertyValueFactory<>("orderQuantity"));
column_cost.setCellValueFactory(new PropertyValueFactory<>("orderCost"));
column_status.setCellValueFactory(new PropertyValueFactory<>("orderStatus"));
}
public void loadDataFromDB(){
try {
String q1 = "SELECT * FROM products";
String query = "SELECT products.itemCode, products.itemName, stock.orderDate, stock.orderedQuantity, products.itemCost, stock.orderStatus " +
"FROM products, stock";
pst = con.prepareStatement(query);
rs = pst.executeQuery();
while (rs.next()){
data.add(new Stock(rs.getString(1), rs.getString(2), rs.getString(3),
rs.getString(4), rs.getString(5), rs.getString(6)));
}
} catch (Exception e) {
e.printStackTrace();
}
table.setItems(data);
}
}
股票类:
public class Stock {
private String itemCode;
private String itemName;
private String orderDate;
private String orderQuantity;
private String orderCost;
private String orderStatus;
public Stock(String itemCode, String itemName, String orderDate, String orderQuantity, String orderCost, String orderStatus) {
this.itemCode = itemCode;
this.itemName = itemName;
this.orderDate = orderDate;
this.orderQuantity = orderQuantity;
this.orderCost = orderCost;
this.orderStatus = orderStatus;
}
public String getitemCode() {
return itemCode;
}
public void setitemCode(String itemCode) {
this.itemCode = itemCode;
}
public String getitemName() {
return itemName;
}
public void setitemName(String itemName) {
this.itemName = itemName;
}
public String getorderDate() {
return orderDate;
}
public void setorderDate(String orderDate) {
this.orderDate = orderDate;
}
public String getorderQuantity() {
return orderQuantity;
}
public void setorderQuantity(String orderQuantity) {
this.orderQuantity = orderQuantity;
}
public String getorderCost() {
return orderCost;
}
public void setorderCost(String orderCost) {
this.orderCost = orderCost;
}
public String getorderStatus() {
return orderStatus;
}
public void setorderStatus(String orderStatus) {
this.orderStatus = orderStatus;
}
}
错误:(我收到所有属性的消息,所以我只是在这里复制了一个)
Oct 22, 2017 8:03:00 PM javafx.scene.control.cell.PropertyValueFactory getCellDataReflectively
WARNING: Can not retrieve property 'itemCode' in PropertyValueFactory: javafx.scene.control.cell.PropertyValueFactory@fe29770 with provided class type: class sample.Stock.Stock
java.lang.IllegalStateException: Cannot read from unreadable property itemCode
at javafx.base/com.sun.javafx.property.PropertyReference.get(PropertyReference.java:170)
at javafx.controls/javafx.scene.control.cell.PropertyValueFactory.getCellDataReflectively(PropertyValueFactory.java:184)
at javafx.controls/javafx.scene.control.cell.PropertyValueFactory.call(PropertyValueFactory.java:154)
at javafx.controls/javafx.scene.control.cell.PropertyValueFactory.call(PropertyValueFactory.java:133)
at javafx.controls/javafx.scene.control.TableColumn.getCellObservableValue(TableColumn.java:593)
at javafx.controls/javafx.scene.control.TableColumn.getCellObservableValue(TableColumn.java:578)
at javafx.controls/javafx.scene.control.TableCell.updateItem(TableCell.java:646)
at javafx.controls/javafx.scene.control.TableCell.indexChanged(TableCell.java:469)
at javafx.controls/javafx.scene.control.IndexedCell.updateIndex(IndexedCell.java:120)
at javafx.controls/javafx.scene.control.skin.TableRowSkinBase.updateCells(TableRowSkinBase.java:539)
at javafx.controls/javafx.scene.control.skin.TableRowSkinBase.<init>(TableRowSkinBase.java:159)
at javafx.controls/javafx.scene.control.skin.TableRowSkin.<init>(TableRowSkin.java:89)
at javafx.controls/javafx.scene.control.TableRow.createDefaultSkin(TableRow.java:213)
at javafx.controls/javafx.scene.control.Control.doProcessCSS(Control.java:897)
at javafx.controls/javafx.scene.control.Control.access$000(Control.java:83)
at javafx.controls/javafx.scene.control.Control$1.doProcessCSS(Control.java:89)
at javafx.controls/com.sun.javafx.scene.control.ControlHelper.processCSSImpl(ControlHelper.java:67)
at javafx.graphics/com.sun.javafx.scene.NodeHelper.processCSS(NodeHelper.java:147)
at javafx.graphics/javafx.scene.Node.processCSS(Node.java:9513)
at javafx.graphics/javafx.scene.Node.applyCss(Node.java:9600)
at javafx.controls/javafx.scene.control.skin.VirtualFlow.setCellIndex(VirtualFlow.java:1715)
at javafx.controls/javafx.scene.control.skin.VirtualFlow.getCell(VirtualFlow.java:1692)
at javafx.controls/javafx.scene.control.skin.VirtualFlow.getCellLength(VirtualFlow.java:1801)
at javafx.controls/javafx.scene.control.skin.VirtualFlow.computeViewportOffset(VirtualFlow.java:2638)
at javafx.controls/javafx.scene.control.skin.VirtualFlow.layoutChildren(VirtualFlow.java:1245)
at javafx.graphics/javafx.scene.Parent.layout(Parent.java:1226)
at javafx.graphics/javafx.scene.Parent.layout(Parent.java:1233)
at javafx.graphics/javafx.scene.Parent.layout(Parent.java:1233)
at javafx.graphics/javafx.scene.Parent.layout(Parent.java:1233)
at javafx.graphics/javafx.scene.Parent.layout(Parent.java:1233)
at javafx.graphics/javafx.scene.Parent.layout(Parent.java:1233)
at javafx.graphics/javafx.scene.Scene.doLayoutPass(Scene.java:590)
at javafx.graphics/javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2507)
at javafx.graphics/com.sun.javafx.tk.Toolkit.lambda$runPulse$2(Toolkit.java:410)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:409)
at javafx.graphics/com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:436)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:518)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:498)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.pulseFromQueue(QuantumToolkit.java:491)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$11(QuantumToolkit.java:319)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:175)
at java.base/java.lang.Thread.run(Thread.java:844)