【问题标题】:Result Set not always being shown in the JTable结果集并不总是显示在 JTable 中
【发布时间】:2016-11-25 08:27:40
【问题描述】:

我正在用 Java 创建一个应用程序,它从 MySQL 数据库中检索一些信息,然后将其显示在屏幕上的 JTable 中。

我用来获取信息并将其放入 DefaultListModel 的代码如下所示。然后将 DefaultListModel 馈送到 JTable,该 JTable 将信息显示在屏幕上。

SwingWorker<Void, Void> worker = new SwingWorker< Void, Void>() {

        @Override
        public Void doInBackground() {

            String SQL = "SELECT * FROM AddABill";

            try {
                Statement stmt = GlobalVars.conn.createStatement();

                ResultSet rs = stmt.executeQuery(SQL);

                menuOptions.clear();

                while(rs.next()){

                    menuOptions.addElement(rs.getString(1) + " - " + rs.getString(2));
                }

                rs.close();
                stmt.close();
            }

            catch (SQLException e) {
                System.out.println("An Error Was Detected! :/");
            }

            return null;
        }

        @Override
        public void done(){
            loadingGif.setVisible(false);
        }

    };

    worker.execute();

我遇到的问题是,有时信息会显示在屏幕上,有时却没有。由于使用的查询没有变化,我假设它与 MySQL 连接有关。

JTable 和 MenuOptions 是这样设置的

menuOptions = new DefaultListModel<>();
menuOptions.addElement("");

menuList = new JList<>(menuOptions);
menuList.setFont(new Font("Myriad Hebrew", Font.PLAIN, 32));
menuList.setBackground(Color.decode("#005952"));
menuList.setForeground(Color.decode("#BEC423"));
menuList.setSelectionBackground(Color.decode("#660033"));
menuList.setSelectionForeground(Color.decode("#FFFFFF"));

所以我想知道的问题是如何确保信息始终显示在屏幕上。显示和不显示的图片如下所示。

显示:

未显示:

最后,要获得要显示的信息,我必须继续重新运行代码,直到它最终显示出来。

非常感谢任何帮助。

【问题讨论】:

  • 1. doInBackground() 内部的所有内容都超出了EDT,您必须通知publish() 内部的GUI ---> process()setProcess()done(), 2.JTable!= DefaultListModel 3. 到重置DefaultListModel,运行SwingWorker,其中在publish() ---&gt; process()setProcess()done() 中添加一个新的ItemDefaultListModel,在您的代码或描述中没有任何内容(对我来说很清楚)
  • @mKorbel 1) 对于应用程序的其余部分,从doInBackground() 对 GUI 的更改已经奏效。 2) 我知道DefaultListMenu 是为JTable 提供信息的东西。如果问题是因为我正在更改 doInBackground() 函数中的代码,那么我很困惑为什么有时它会起作用,有时却不起作用。
  • 它可能有时起作用,但并不可靠;更多herehere

标签: java mysql swing jtable resultset


【解决方案1】:

@trashgod @mKorbel

感谢大家的帮助,我通过将 done() 函数中的信息添加到表中解决了这个问题。代码如下

SwingWorker<Void, Void> worker = new SwingWorker< Void, Void>() {

        String[] billItems = null;

        @Override
        public Void doInBackground() {

            String SQL = "SELECT * FROM AddABill";

            try {
                Statement stmt = GlobalVars.conn.createStatement();

                ResultSet rs = stmt.executeQuery(SQL);

                //Set The Cursor To Last Position
                rs.last();

                int totalRows = rs.getRow();

                billItems = new String[totalRows];

                //Set The Cursor Back To The Start
                rs.beforeFirst();

                while(rs.next()){
                    int rowNum = rs.getRow() - 1;
                    billItems[rowNum] = rs.getString(1) + " - " + rs.getString(2);
                }

                rs.close();
                stmt.close();
            }

            catch (SQLException e) {
                System.out.println("An Error Was Detected! :/");
            }

            return null;
        }

        @Override
        public void done(){
            menuOptions.clear();

            for(int i = 0; i < billItems.length; i++){
                menuOptions.addElement(billItems[i]);
            }

            loadingGif.setVisible(false);
        }

    };

谢谢,

托马斯。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多