0

我目前正在尝试使用 MySQL 学习 JTable。我已将我的数据库设置为 JTable 并使用滚动窗格将其添加到我的 GUI 中。

我的问题是,当我单击按钮时,如何创建更新数据库或执行搜索操作的功能(两者都是一样的......)。

这是我的代码(我正在将数据库信息读入我的 .ini 文件)

final Vector columnNames = new Vector();
        final Vector data = new Vector();

        try
        {
            //  Connect to an Access Database



            driver = IniFonksiyon.iniSVNOkut(driver, "databaseBilgileri", "driver");//"com.mysql.jdbc.Driver";
            url = IniFonksiyon.iniOkut(url, "databaseBilgileri", "url");//"jdbc:mysql://localhost:3306/";
            userid = IniFonksiyon.iniOkut(userid, "databaseBilgileri", "kullanici");
            password = IniFonksiyon.iniOkut(password, "databaseBilgileri", "sifre");
            dbName = IniFonksiyon.iniOkut(dbName, "databaseBilgileri", "dbIsmi");

            Class.forName( driver );
            Connection connection = DriverManager.getConnection( url+dbName , userid, password );

            //  Read data from a table

            String sql = "select * from profildb.tbl_detailed";
            Statement stmt = connection.createStatement();
            ResultSet rs = stmt.executeQuery( sql );

            ResultSetMetaData md = rs.getMetaData();
            int columns = md.getColumnCount();

            //  Get column names

            for (int i = 1; i <= columns; i++)
            {
                columnNames.addElement( md.getColumnName(i) );
            }

            //  Get row data

            while (rs.next())
            {
                Vector row = new Vector(columns);

                for (int i = 1; i <= columns; i++)
                {
                    row.addElement( rs.getObject(i) );
                }

                data.addElement( row );
            }

            rs.close();
            stmt.close();
            connection.close();
        }
        catch(Exception e)
        {
            System.out.println( e );
        }

        //  Create table with database data

        final JTable table = new JTable(data, columnNames)
        {
            /**
             * 
             */
            private static final long serialVersionUID = 1L;

            public Class getColumnClass(int column)
            {
                for (int row = 0; row < getRowCount(); row++)
                {
                    Object o = getValueAt(row, column);

                    if (o != null)
                    {
                        return o.getClass();
                    }
                }

                return Object.class;
            }
        };

这是处理创建表的代码,但它与我的主要 GUI 功能直接相关,所以如何刷新/执行其他操作,如搜索功能?

4

1 回答 1

2

使用表格模型更容易。请参阅相关教程。您可以使用DefaultTableModel或您自己的TableModel. 如果不能满足您的需求,扩展AbstractTableModel通常是最常见的方法。DefaultTableModel

为了获得更好的 Swing 应用程序性能和响应能力,不应在EDT上执行长时间运行的任务。因此,最好从 EDT 以外的线程访问数据库。

SwingWorker可用于此目的。从数据库中获取数据SwingWorker.doInBackground()。然后,在SwingWorker.done().

这种实现方式有很多变体。这些特定于您的应用程序的性质和要求。例如,您可以使用 SwingWorker 的publish()/process()串联来处理块中的数据。您可以选择将数据库访问逻辑合并到您的模型中或创建扩展SwingWorker.

于 2012-07-08T04:12:39.677 回答