如何用我的嵌入式数据库填充JTable?

时间:2017-03-08 12:30:31

标签: java sql jdbc derby embedded-database

我无法在GUI应用程序中显示数据库填充的JTable。

下面的代码贯穿并创建了一个带面板的GUI,然后创建我的JTable并将其添加到我的应用程序中。然后我运行一个假定填充表的方法。填充完成后,没有任何显示。

解析我的代码,我导致相信某处导致数据无法解析到我的表中,原因不明,这就是我来这里的原因。

点击按钮,此代码需要:

JTable tigerTable = new JTable();

JPanel centerPanel = new JPanel();

centerPanel.add(tigerTable, new GridBagConstraints());

FillTable(tigerTable, "SELECT * FROM TIGER_INFO");

FillTable方法如下:

//Add buildTableModel method
public void FillTable(JTable table, String Query)
{
    try
    {

        Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
        Connection conn = DriverManager.getConnection("jdbc:derby:STOCK_CONTROL");
        Statement stat = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
        ResultSet rs = stat.executeQuery(Query);
        System.out.println("Connected");

        //Remove previously added rows
        while (table.getRowCount() > 0)
        {
            ((DefaultTableModel) table.getModel()).removeRow(0);
        }

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

        while (rs.next())
        {
            Object[] row = new Object[columns];

            for (int i = 1; i <= columns; i++)
            {
                row[i - 1] = rs.getObject(i);
            }
            ((DefaultTableModel) table.getModel()).insertRow(rs.getRow() - 1, row);
        }

        rs.close();
        stat.close();
        conn.close();         
    }
    catch (InstantiationException |
            IllegalAccessException |
            ClassNotFoundException |
            SQLException e)
    {
        System.out.println(e);
        e.printStackTrace();
    }
}

这样做会创建应用程序,但不会显示任何包含数据的表。我的数据库包含3列和3行,但我没有看到我的数据显示在JTable中。

我的问题是,如何在数据库中填充JTable并在我的GUI应用程序中正确显示?

如果您还有其他需要,请告诉我,我会尽可能多地提供。

提前谢谢。

3 个答案:

答案 0 :(得分:1)

我认为你混合操作,我建议使用这个指令:

  1. 创建Bean或实体以存储对象的信息
  2. 获取您的数据列表
  3. 在JTable中显示您的数据,
  4. 因此,您可以使用它在JTable中显示数据:

    ....
    List<TIGER_INFO> list = new ArrayList<>();//create a List of data
    while (rs.next()){
       //fill data in your List
       list.add(new TIGER_INFO(rs.getTYPExxx("att1"), rs.getTYPExxx("att2"), rs.getTYPExxx("att3"));        
    }
    
    //when you finish call your function which display your data :
    fillData(list);
    ....
    

    填充日期方法可以如下所示:

    private void fillData(List<TIGER_INFO> list) {
        DefaultTableModel model = (DefaultTableModel) jTableName.getModel();
    
        while (model.getRowCount() > 0) {
            for (int i = 0; i < model.getRowCount(); i++) {
                model.removeRow(i);
            }
        }
    
        for (TIGER_INFO obj : list) {
            model.addRow(new Object[]{
                obj.getAttribute1(),
                obj.getAttribute2,
                obj.getAttribute3
            });
        }
    }
    

答案 1 :(得分:0)

我建议编写一个扩展AbstractTableModel的类。在此类中添加一个函数,根据SQL语句填充内容。然后它看起来像:

TigerTableModel tigerModel = new TigerTableModel(dbConnection);
tigerModel.executeQuery("select * FROM TIGER_INFO");
JTable tigerTable = new JTable(tigerModel);

或者您创建了一个能够运行每个SQL语句的通用TableModel,因此您的项目非常灵活。

答案 2 :(得分:0)

我找到了解决方案 - 我一直在努力解决这个问题太久了,我终于解决了。

首先尝试手动设置表格模型。

JTable tigerTable = new JTable();
tigerTable.setModel(new DefaultTableModel(0, numberOfColumns));

如果您没有指定模型,JTable会创建一个匿名内部类,并且通常不会按照您的意愿行事。