gpt4 book ai didi

Javafx TableView 未显示所有列中的数据

转载 作者:行者123 更新时间:2023-12-01 16:52:43 26 4
gpt4 key购买 nike

好吧,刚接触 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 not populating Tableview ,但我会专门解决您的具体情况,所以很清楚。

建议的解决方案(使用 Lambda,而不是 PropertyValueFactory)

而不是:

aColumn.setCellValueFactory(new PropertyValueFactory<Appointment,LocalDate>("date"));

写:

aColumn.setCellValueFactory(cellData -> cellData.getValue().dateProperty());

有关更多信息,请参阅此答案:

<小时/>

使用 PropertyValueFactory 的解决方案

上面概述的 lambda 解决方案是首选,但如果您希望使用 PropertyValueFactory,此替代解决方案提供了相关信息。

背景

PropertyValueFactory使用反射来确定获取和设置数据值以及从模型类中检索可绑定(bind)属性的方法。遵循的模式是:

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

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

为什么您的应用程序无法运行

你有这三个表达式:

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()

PropertyValueFactory 只会选取 getDateEntered(),因为这是 sresult 类中定义的唯一匹配方法。

建议

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

采用Java camel case naming conventions还使 Java 开发人员更容易阅读您的代码。

关于Javafx TableView 未显示所有列中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61658516/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com