【问题标题】:JavaFX I can´t fill tableview by observableListJavaFX 我无法通过 observableList 填充 tableview
【发布时间】:2025-12-11 04:10:02
【问题描述】:

我在填充 Tableview 时遇到问题。 当我运行此代码时,我的 tableview 具有与 Observablelist 相同数量的记录,但没有任何内容可见。

有什么想法吗?一个不理解一些像 cellvalueProperty。这对我的例子有用吗?谢谢。

 package SYSSEL;
 import java.sql.SQLException;
 import javafx.event.ActionEvent;
 import javafx.fxml.FXML;
 import javafx.scene.control.Button;
 import javafx.stage.Stage;
 import java.sql.ResultSet;
 import javafx.scene.control.*;
 import javafx.collections.FXCollections;
 import javafx.collections.ObservableList;

 public class gridOfMessages extends Stage {

   private ObservableList messages;
   @FXML
   private Button buttonCloseGrid;

   @FXML
   private TableColumn C1;

   @FXML
   private TableColumn C2;

   @FXML
   private TableColumn C3;


   @FXML
   private Button buttonRefreshGrid;

   @FXML
   private TableView<gridOfMessages> gridOfMessagesList;


   @FXML
   private void HandlerCloseGrid(ActionEvent event) {

   }

   @FXML
   private void handlerRefreshGrid(ActionEvent event) throws ClassNotFoundException, SQLException {
     //Main Scene
     ResultSet rq = PdfSorting.checkNewMsgs();
     rq.first();
     messages=FXCollections.observableArrayList();
     while(rq.next()){
       //Iterate Row;
       ObservableList<String> row = FXCollections.observableArrayList();
       row.add(rq.getString("ID_DOCUMENT_ESSL"));
       row.add(rq.getString("DOCUMENT_PATH"));
       row.add(rq.getString("BAN"));
       System.out.println("Row [1] added "+row );
       messages.add(row);

     }
     gridOfMessagesList.setItems(messages);

   }
 }



<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane id="AnchorPane" minWidth="307.0" prefHeight="506.999977929685" prefWidth="307.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="SYSSEL.gridOfMessages">
  <children>
    <Button id="ButtonCloseGrid" fx:id="buttonCloseGrid" layoutX="0.0" layoutY="468.0" mnemonicParsing="false" onAction="#HandlerCloseGrid" prefHeight="39.0" prefWidth="147.0" text="Zavřít" />
    <Button id="refreshGrid" fx:id="buttonRefreshGrid" layoutX="147.0" layoutY="468.0" mnemonicParsing="false" onAction="#handlerRefreshGrid" prefHeight="39.0" prefWidth="161.0" text="Aktualizovat" />
    <TableView fx:id="gridOfMessagesList" layoutX="0.0" layoutY="0.0" prefHeight="468.0" prefWidth="307.0">
      <columns>
        <TableColumn maxWidth="5000.0" minWidth="10.0" prefWidth="72.0" text="Číslo datovky" fx:id="C1" />
        <TableColumn maxWidth="5000.0" minWidth="10.0" prefWidth="147.0" text="Cesta" fx:id="C2" />
        <TableColumn maxWidth="5000.0" minWidth="10.0" prefWidth="87.0" text="BAN" fx:id="C3" />
      </columns>
    </TableView>
  </children>
</AnchorPane>

【问题讨论】:

    标签: java javafx tableview fxml observablelist


    【解决方案1】:

    是的,您需要为表中的每一列设置cell value factory,这是肯定的。但是你也应该发布你的 fxml 文件代码,没有它我无法确认这是否是一个问题。

    单元格值工厂表示值从何而来。如果你的表数据模型类型是gridOfMessages,那么表数据的可观察列表应该是相同的类型。

    编辑:

    从您的 fxml 文件中很明显,您需要为每一列添加单元格值工厂,如下例所示,只需将 firstName 替换为数据模型 bean 中的属性名称。

      <TableColumn text="First Name">
        <cellValueFactory>
          <PropertyValueFactory property="firstName" />
        </cellValueFactory>
      </TableColumn>
    

    如果您没有为 TableView 和 ObservableList 设置数据类型,将假定默认的 Object 类型。无论如何,表格中的一列以上很难做到这一点。

    编辑:

    然后你需要编写一个代表一个表格行的类。例如,如果您想要一个包含三列的表,您需要一个具有三个属性的 bean。然后将其设置为 TableView 和 ObservableList 的类型,用数据填充该列表,并为表设置它,就像它已经在您的代码中一样。那应该在控制器类中。这是一个笼统的描述,因为我不知道这个表应该代表什么。

    您还可以通过 Oracle 的 tutorial 帮助了解如何使用 fxml 在表中显示数据。

    【讨论】:

    • 我添加了 fxml 代码。那么,当我不使用任何类型的 tableview 和 observable 列表时呢?
    • 好的,我试试,然后呢? A 我必须写一些给控制器?谢谢