Javafx tableview 未在所有列中显示数据

Posted

技术标签:

【中文标题】Javafx tableview 未在所有列中显示数据【英文标题】:Javafx tableview not showing data in all columns 【发布时间】:2013-09-29 01:11:04 【问题描述】:

好的,几周前刚接触 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;
        
    

【问题讨论】:

【参考方案1】:

这个问题确实是重复的:Javafx PropertyValueFactory not populating Tableview,但我会专门针对你的具体情况,所以很清楚。

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

代替:

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

写:

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

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

Java: setCellValuefactory; Lambda vs. PropertyValueFactory; advantages/disadvantages How do you use a JavaFX TableView with java records? 演示用 lambda 表达式替换 PropertyValueFactory。

使用 PropertyValueFactory 的解决方案

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

背景

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

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

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

建议

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

采用Java camel case naming conventions 还可以让Java 开发人员更轻松地阅读您的代码。

【讨论】:

@jewelsea 你能解释一下如何创建我的细胞工厂吗?这是我的问题,自从一周以来我一直在这里苦苦挣扎***.com/questions/43099841/… 程序运行没有错误并且没有显示表中的数据!! 您不必创建自己的单元格值工厂,如果您的属性被模型类公开,只需设置col.setCellValueFactory(features -&gt; features.getValue().colProperty());【参考方案2】:

有时由于列名,列不显示数据。例如,

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

gettergetcDesc cDesc 列可能不显示数据。如果您将代码更改为

new PropertyValueFactory<sresult, String>("CDesc")

gettergetCDesc CDesc 列可以显示数据。

【讨论】:

no: column 名称与它无关 - 重要的是 property 名称.. 请阅读 PropertyValueFactory 的 api 文档。您尝试回答很好,但是:准确地说,格式化代码并遵守 java 命名约定。【参考方案3】:

对于在完成上述操作后仍然没有得到它的任何其他人,我的问题是我没有指定我的二传手具有“公开决赛”称号。

【讨论】:

不完全确定您的意思 - 但不需要“最终”修饰符.. Final 不是必需的,但他提出了一个很好的观点,即 getter 需要公开。

以上是关于Javafx tableview 未在所有列中显示数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JavaFx TableView 中添加 TableView 页脚

javafx tableView 不显示数据,getter setter 有啥问题?

javafx tableview 检测任何行的任何更改,包括添加新行

JavaFX:将 UI 控件添加到 TreeTableView

JavaFX TableView Integer 不显示,而 String 项目是

用于大型数据库表的 JavaFx TableView CRUD