JTable无法在java中显示数据库值

时间:2016-05-04 17:09:46

标签: jtable

我确定获取了数据库值,但它仍然无法显示。 Netbeans 8.1 jdk 1.8.0.74 jre 1.8.0.91

       ...
    ...     
        //---------------------------------DataBase------------------------------------------------------------
    }
    public void valuetable()
    {        
        try
        {
            Class.forName("com.mysql.jdbc.Driver");
            conn = java.sql.DriverManager.getConnection(url, user, password);

连接到mysql没问题。

sql = "SELECT * FROM hams";
            ps = conn.prepareStatement(sql);

            java.util.Vector tableContent = new java.util.Vector();
            java.util.Vector columnName = new java.util.Vector();
            metaData = ps.getMetaData();
            int columnCount = metaData.getColumnCount();
            for (int i = 1; i <= columnCount; i++) 
            {
                columnName.add(metaData.getColumnName(i));
            }            
            rs = ps.executeQuery();
            while (rs.next())
            {
                java.util.Vector rowData = new java.util.Vector();
                for (int i = 1; i <= columnCount; i++)
                {
                    rowData.add(rs.getObject(i));
                }
                tableContent.add(rowData);
            }            
            tableModel = new HAMS(tableContent, columnName);
            jScrollPane1 = new javax.swing.JScrollPane(jTable1);

获取所有数据库值

}
        catch(Exception e)
        {
            javax.swing.JOptionPane.showMessageDialog(null, e.getMessage());
        }
    }   
}    

4 个答案:

答案 0 :(得分:0)

您可能会错过表格模型中基础数据已更改的通知。尝试添加以下行

tableModel fireTableDataChanged();

行后

jScrollPane1 = new javax.swing.JScrollPane(jTable1);

答案 1 :(得分:0)

谢谢回复,我试着添加

tableModel.fireTableDataChanged();

行后

jScrollPane1 = new javax.swing.JScrollPane(jTable1);

但是jTable1仍然为空,并显示错误,如图片。 Error

答案 2 :(得分:0)

自己解决问题,解决方案是基于java书中的例子 首先,在类块中,添加以下代码:

public MonitorInterface(java.util.Vector data, java.util.Vector columnNames)
    {
        super(data, columnNames);
    }

    public boolean isCellEditable(int row, int col) 
    {
        return false;
    }
    static final int SCROLL = java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE;
    static final int UPDATABLE = java.sql.ResultSet.CONCUR_UPDATABLE;

第二,方法:

public void tablevalue()
    {
            java.util.Vector col = new java.util.Vector();
            java.util.Vector data = new java.util.Vector();
            try 
            {
                Thread.sleep(100);
                //Connect MySQL JDBC driver
                Class.forName("com.mysql.jdbc.Driver");
                //Connect to host
                conn = DriverManager.getConnection(url, user, password);
                //Connect to DB
                ps = conn.prepareStatement(sql);
                //Get row and column info
                metaData = ps.getMetaData();
                int columnCount = metaData.getColumnCount();
                for (int i = 1; i <= columnCount; i++)
                {
                    col.add(metaData.getColumnName(i));
                }
                rs = ps.executeQuery();
                while (rs.next())
                {
                    java.util.Vector rowData = new java.util.Vector();
                    for (int i = 1; i <= columnCount; i++) 
                    {
                        rowData.add(rs.getObject(i));
                    }
                    data.add(rowData);
                }
                tableModel = new MonitorInterface(data, col);
                jTable1 = new javax.swing.JTable(tableModel);
                jScrollPane1.setViewportView(jTable1);
                jTable1.setFillsViewportHeight(true);                
                // Close all connect
                rs.close();
                ps.close();
                conn.close();
            } 
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }    
}

最后,数据库值显示在JTable中,但在数据库插入新数据时无法自动更新JTable。

jTable1.validate();
 jTable1.updateUI();
 jTable1.repaint();
 tableModel.fireTableDataChanged();

我试试这些方法,但仍无效果。

答案 3 :(得分:0)

问题解决了。 我在我的项目中创建了四个类,一个类是程序入口的主要方法,B类是显示用户界面的gui,C类是接收客户端数据,D类是将客户端数据保存到数据库。

我为B类中的show database值创建了一个方法,并在此方法的任何位置插入此代码,

System.out.println("123");

在B类中调用此方法,它只执行一次,即使数据库值发生变化,也无法显示最新值,因此,我尝试在C类中调用此方法,它有效,在数据库值更改时显示最新值

我认为问题是:

  1. B类只显示GUI,需要执行一次,不需要两次。
  2. 由于C类必须继续接收客户端数据,因此,最新的数据库值可以在JTable中显示。
  3. 抱歉我的游泳池英语。