当前位置: 首页 > 知识库问答 >
问题:

JavaFX dynamic TableView不显示数据库中的数据

柯甫
2023-03-14

下面是FXML代码-

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

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


<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="508.0" prefWidth="483.0" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1" fx:controller="imran.jfx.application.Controller">
   <children>
      <TableView fx:id="tableview" layoutX="19.0" layoutY="94.0" prefHeight="402.0" prefWidth="443.0">
        <columns>
          <TableColumn fx:id="id" prefWidth="75.0" text="ID" />
          <TableColumn fx:id="english" prefWidth="170.0" text="English" />
            <TableColumn fx:id="bangla" prefWidth="197.0" text="Bangla" />
        </columns>
      </TableView>
      <Button fx:id="showTableview" layoutX="188.0" layoutY="52.0" mnemonicParsing="false" onAction="#showTableData" text="Show Tables" />
   </children>
</Pane>

我尝试与数据库连接,并尝试将数据从数据库显示到TableView。我尝试将这些东西实现到控制器类中,如下所示-

package imran.jfx.application;

import java.net.URL;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ResourceBundle;

import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.control.TableView;
import javafx.util.Callback;

public class Controller implements Initializable{

    private ObservableList<ObservableList> data;

    @FXML
    private TableView<?> tableview;

    @FXML
    private TableColumn<?, ?> id;

    @FXML
    private TableColumn<?, ?> english;

    @FXML
    private TableColumn<?, ?> bangla;

    @FXML
    private Button showTableview;

    ResultSet result;
    PreparedStatement doQuery;
    Connection conn;
    String query;

    @Override
    public void initialize(URL location, ResourceBundle resources) 
    {
        try 
        {
            Class.forName("org.sqlite.JDBC");
        } 
        catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        String url="jdbc:sqlite::resource:database/bn_words.db";
        try 
        {
            conn = DriverManager.getConnection(url);
        } 
        catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public void buildData()
    {
          data = FXCollections.observableArrayList();

          try{
            Class.forName("org.sqlite.JDBC");
            String url="jdbc:sqlite::resource:database/bn_words.db";
            conn = DriverManager.getConnection(url);

            String SQL = "SELECT _id,en_word,bn_word from words";

            ResultSet rs = conn.createStatement().executeQuery(SQL);


            for(int i=0 ; i<rs.getMetaData().getColumnCount(); i++)
            {
                final int j = i;                
                TableColumn col = new TableColumn(rs.getMetaData().getColumnName(i+1));
                col.setCellValueFactory(new Callback<CellDataFeatures<ObservableList,String>,ObservableValue<String>>(){                    
                    public ObservableValue<String> call(CellDataFeatures<ObservableList, String> param) {                                                                                              
                        return new SimpleStringProperty(param.getValue().get(j).toString());                        
                    }                    
                });

                tableview.getColumns().addAll(col); 
                System.out.println("Column ["+i+"] ");
            }

            while(rs.next()){
                ObservableList<String> row = FXCollections.observableArrayList();
                for(int i=1 ; i<=rs.getMetaData().getColumnCount(); i++){
                    row.add(rs.getString(i));
                }
                System.out.println("Row [1] added "+row );
                data.add(row);

            }
            tableview.setItems(data);
          }catch(Exception e){
              e.printStackTrace();
              System.out.println("Error on Building Data");             
          }
      }

    @FXML
    void showTableData(ActionEvent event) {
        tableview = new TableView();
        buildData();
    }
}

问题是,它显示tableview.setitems(data);行错误。我不知道这个错误的原因。如果我将private TableView<?>TableView;一行编辑为private TableView TableView;,则不会显示TableView.setitems(data);行的任何错误。然后应用程序运行良好。但是,当我单击Show TableWiew按钮时,它不会将数据显示到TableView中,而是将数据显示到控制台中。

我应该忽略这些错误吗?我如何解决我的问题?

共有1个答案

夏理
2023-03-14

不,不要忽略警告。出现警告是因为您将原始类型用于“泛型”类型,即参数化类型。如果这样做,最终可能会导致编译器无法捕获的类型不匹配。使用正确声明的类型并使其正确将使程序更加健壮。

例如,tableview是一个泛型类型:它被声明为tableview 。这里t是一个类型参数:您可以(松散地说)将t看作一个变量,表示表中每一行中事物的类型。在创建实际的tableview时,必须指定特定的tableview要保存的类型。在您的示例中,每一行都由ObservableList表示。现在,ObservableList也是一个泛型类型:它被声明为ObservableList ,其中e表示列表中每个元素的类型。在本例中,在buildData()方法中,为每一行创建ObservableList 。因此,您的表类型是ObservableList ,因此您应该替换

@FXML
private TableView<?> tableView ;

@FXML
private TableView<ObservableList<String>> tableView ;
private ObservableList<ObservableList> data;
private ObservableList<ObservableList<String>> data ;

还应该修复tableColumn的声明。TableColumn定义为TableColumn 。这里s是表的类型(即表示表中一行的每个项的类型:它与tableview定义中的t相同),t是列中单元格中每个值的类型。所有列中的单元格中的每个值都是string,因此在builddata()中应该具有:

TableColumn<ObservableList<String>, String> col = new TableColumn<>(rs.getMetaData().getColumnName(i+1));

(请注意,由于这些列是要添加到表中的列,所以并不清楚为什么在FXML中也定义了列;不过,这有点偏离了您所问问题的主题。)

当您使用常规列表作为表的数据类型时,所有这些都变得非常复杂。因为在这个表中,您知道数据库中有多少列,以及这些列代表什么,所以我强烈建议通过定义一个类来表示每一行中的数据,从而使表更加具体。我不知道您的应用程序是什么,所以我会做出一个(可能不正确的)猜测,它正在进行一些翻译。所以我会这么做

public class TranslatedWord {

    private final StringProperty id = new SimpleStringProperty();

    public StringProperty idProperty() {
        return id ;
    }
    public final String getId() {
        return idProperty().get();
    }
    public final void setId(String id) {
        idProperty().set(id);
    }

    private final StringProperty english = new SimpleStringProperty();

    public StringProperty englishProperty() {
        return english ;
    }
    public final String getEnglish() {
        return englishProperty().get();
    }
    public final void setEnglish(String english) {
        englishProperty().set(english);
    }

    private final StringProperty bangla = new SimpleStringProperty();

    public StringProperty banglaProperty() {
        return bangla ;
    }
    public final String getBangla() {
        return banglaProperty().get();
    }
    public final void setId(String bangla) {
        banglaProperty().set(bangla);
    }

}

现在创建tableView tableColumn 、string> 等。data变成了observableList ,而buildData()方法的代码如下

        while(rs.next()){
            TranslatedWord word = new TranslatedWord();
            word.setId(rs.getString("id"));
            word.setEnglish(rs.getString("english"));
            word.setBangla(rs.getString("bangla"));
            System.out.println("Row [1] added "+row );
            data.add(row);

        }

一旦您习惯了这种结构,您将发现这是一种更容易维护的样式,因为类型指定了它们所表示的内容。

在这段代码中还有许多其他错误:正如我前面所说的,您正在用FXML创建tableviewtablecolumn,但随后在控制器中创建新的并操作它们。因此,即使您解决了您实际询问的问题,您可能会发现,在您也解决这些问题之前,它不会以您想要的方式工作。但是消除编译错误和警告将是一个开始...

 类似资料:
  • 应用程序运行良好...只是数据没有出现...我已经添加了sha用户电子邮件显示在登录后,在登录活动中我已经添加了 但是在实时数据库数据不显示以防万一…我也等了半个小时,尝试了所有的东西…网络也不错。数据库中的数据库规则的数据库图片 mainActivity.java//不能用于单个子级,即firebaseDatabase.getInstance().getReference().child(“aj

  • 问题内容: 我正在使用jdbc编写程序,该程序将成为数据库的接口(类似于CRUD应用程序)。我假设我必须编写一个类(例如),该类将对数据库执行所有操作(以及可能会简化为这些操作的某些其他逻辑)。用户界面由一组表和一些按钮组成。要使用Jtable,我需要实现一个类(例如),它是AbstractTableModel的子类。因此,此类将向用户显示我的数据。我需要为数据库架构中的所有表实现这种模型。我不想

  • 这是我的数据库代码,我想从我的数据库中检索名称,并将其显示在listview中,在下面发布的另一个java文件中显示为profilelist.jar。但是我不能这样做,请告诉我这段代码是否正确? profileList.java 我在a.vaccination.datahandler.getTitle(datahandler.java:115)和a.vaccination.profilelist.

  • 我试图在phpmyadmin中为我的服务器构建一个数据库,但是当我完成构建后,我无法使用PHP访问它,并且当我在MySQL中列出数据库时,它也不会显示出来。但当我在mySql中创建数据库时,它会显示在phpmyadmin中。另外,我正在运行phpmyadmin版本4.0.3,页面底部有一条声明说

  • 问题内容: 我一直在寻找如何从数据库中检索二进制数据。我的查询工作正常,因为它在SQL管理器中显示了二进制数据。 但是在Visual Studio 2010中,它只是向我显示,我个人认为这不是问题,但是如果我尝试检索它并将其存储在变量中,则它只是空的。只要与二进制数据无关,任何其他查询都可以工作… 而且我不想使用数据网格或其他任何东西,因为我只需要将其用作变量。 我知道这不是完整的代码,但这是出问

  • 所以,数据库(MySQL)中有一个包含姓名和照片(blob)的表。在我的网页应用程序的主页上有一个按钮,点击它后-它必须是另一个页面,包含数据库的所有结果。我使用servlet/jsp/、jdbc和MVC模式,我有带有字段名称和照片(字节[])的实体User,我有返回List的DAO类,我想在结果页面上从数据库中检索每个用户照片和照片附近的他的名字。 如何使用 servlet/jsp 执行此操作?