list - 在 JavaFX TableView 中显示数据库中的项目

标签 list javafx tableview resultset println

好吧,我对此很陌生,我已经搜索了两周,试图将 SQL 结果集打印到由 JavaFX Scene Builder 制作的 TableView。我可以使用 System.out.println 打印我的结果集,并且数据是正确的,但是当我尝试将其放入列表中时,我的表格 View 显示一列带有 0,另一列为空白。我正在尝试打印列表(println),但我得到的是对象指针(?)而不是数据,所以我看不到我是否从 ResultSet 错误地传递到列表。

任何帮助将不胜感激......我想理解这个概念,而不仅仅是得到答案。

这是我的 Controller 代码:

public class TesterUIController implements Initializable {

    @FXML
    private TableView<dataClass> Table;
    @FXML
    private Button TestButton;
    @FXML
    private TableColumn<dataClass, Integer> colKey;
    @FXML
    private TableColumn<dataClass, String> colSalesNo;

    public static void main (String[] args) {
        System.out.println("Main has run");
    }


    /**
     *
     * @param fxmlFileLocation
     * @param resources
     */
    @Override
    public void initialize(URL fxmlFileLocation, ResourceBundle resources) {
            TestButton.setOnAction(new EventHandler<ActionEvent>() {

                @Override
                public void handle(ActionEvent event) {
                    System.out.println("Button Pressed");
                    colKey.setCellValueFactory(new PropertyValueFactory<dataClass, Integer>("Key"));
                    colSalesNo.setCellValueFactory(new PropertyValueFactory<dataClass, String>("SalesNo"));

                    Table.getItems().setAll(gobbledyGook());

                }
            } );
    }

    /*
     * dataClass is a (sub)class representing the data for TableView "Table"
     */

    public class dataClass {
        private IntegerProperty Key;
        public void setKey (int value) {KeyProperty().set(value);}
        public int getKey() {
            return KeyProperty().get();
        }
        public IntegerProperty KeyProperty() {
            if (Key == null) Key = new SimpleIntegerProperty(this, "Key");
            return Key;
        }

        private StringProperty SalesNo;
        public void setSalesNo(String value) {
            SalesNoProperty().set(value);
        }
        public String getSalesNo() {
            return SalesNoProperty().get();
        }
        public StringProperty SalesNoProperty() {
            if (SalesNo == null) SalesNo = new SimpleStringProperty(this, "SalesNo");
            return SalesNo;
        }
    }

    private List<dataClass> gobbledyGook() { //ObservableList<dataClass> gobbledyGook() { // ResultSet getData() {
        Connection conn;
        String dbDriver;
        Statement st;
        ResultSet rs;// = null;
        List ll = new LinkedList();

        try {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            dbDriver = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};"
                    + "DBQ=Inventario.mdb;";
            conn = DriverManager.getConnection(dbDriver, "", "");
            st = conn.createStatement();

            String getSalesNumber = "SELECT * FROM SalesNumber " // TOP 1 * FROM ...
                    + "ORDER BY SalesNumber.Key DESC";// LIMIT 1";
            rs = st.executeQuery(getSalesNumber);

            while (rs.next()) {

                int Key = rs.getInt(1);
                double saleNo = rs.getDouble(2);
                NumberFormat formatter = new DecimalFormat("###########");
                String SalesNo = formatter.format(saleNo);
                System.out.println(Key + ", " + SalesNo); //key + ", " + saleNo);

                dataClass roww = new dataClass();
                ll.add(roww);

            }
        }
        catch (ClassNotFoundException | SQLException ex) {
            Logger.getLogger(TesterUIController.class.getName()).log(Level.SEVERE, null, ex);
        }
        return ll;
    }

}

最佳答案

您的问题

您的表是空的,因为您从未初始化您创建的dataClass roww 的值。请尝试使用以下代码:

dataClass roww = new dataClass();
roww.setKey(Key);
roww.setSalesNo(SalesNo);
ll.add(roww);

一个更好的想法可能是为 dataClass 提供一个构造函数,它将 KeySalesNo 作为参数 - 这样你的 dataClass 保证实例正确初始化。

ll.add(
  new dataClass(
    Key, 
    SalesNo
  )
);

引用解决方案

这是一些 sample code 的链接用于通过 JDBC 从 JavaFX 访问数据库并用结果填充 ListView。该代码是为 StackOverflow 问题创建的:javafx connection to mysql

该代码与您问题中的代码类似,很容易理解(这就是我链接它的原因),但存在一个缺陷,即数据库查找是在 JavaFX 应用程序线程上完成的。这意味着在进行数据库查找时应用程序 UI 会被卡住。这不是最佳的。为了解决这个问题,我创建了另一个 background thread based database access sample对于 stackoverflow 问题:JavaFX - Background Thread for SQL Query 。此解决方案使用 Task 在后台线程上执行查询,是更可取的。

旁白

我建议遵循Java naming conventions因为它将使您的程序更容易被其他开发人员理解。

关于list - 在 JavaFX TableView 中显示数据库中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16228502/

相关文章:

python - 将列表转换为元组列表,每个元组中的项目具有重复值

python - 将列表与数据框列进行比较并创建带有数字的新列

Swift RunLoop 阻止 TableView

arrays - 在 Swift 2 中从 segue 展开后 Tableview 不重新加载

c# - 我如何移动列表末尾的列表对象,同时将其他对象移回?

list - 如何检查一个 numpy 数组的列表是否包含另一个 numpy 数组

java - 跟踪在 javafx 中绑定(bind)的节点的变化

java - 如何在 JavaFX 中传递参数

Java fx 缓慢移动的图像

iphone - 如何在分离的 UITableViewCell 和另一个 View 之间执行 segue