【问题标题】:JTable only displaying 1 rowJTable 只显示 1 行
【发布时间】:2014-01-27 12:11:54
【问题描述】:

我试图在JTable(两列)中显示部分结果集,但我只能看到一行。 JTable 在现有的 GUI 中,结果集被传递给 GUI 类中的方法。 当我执行Vector size() 时,它会返回一个。 这告诉我列表中只有一个条目。我应该看到 4 个条目我看到的条目是我期望的 4 个条目中的最后一个。

请看下面的方法: 任何帮助将不胜感激。

public static void getResultSet(ResultSet resultSet)  throws SQLException { 

        ResultSetMetaData metaData = resultSet.getMetaData();

                    //JTable name is resultsTable includes Scrollpane


         // names of columns

        Vector<String> columnNames = new Vector<String>();
        int columnCount = 2;
        for (int column = 1; column <= columnCount; column++) {
            columnNames.add(metaData.getColumnName(column));
            System.out.println("ColumnNames "+columnNames );
        }

     // data from the table

      //  Vector<Vector<Object>> data = new Vector<Vector<Object>>();
        Vector<Vector<String>> data = new Vector<Vector<String>>();
        while (resultSet.next()) {
            Vector<String> vector = new Vector<String>();
            for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
                vector.add(resultSet.getString(columnIndex)); 
            }

            data.add(vector);
            System.out.println("Vector Value = "+ data);
            System.out.println("Vector Size =" + data.size()); //Returning 1 - Should see 4 entries

            DefaultTableModel datamodel = new DefaultTableModel(data,columnNames);
            resultsTable.setModel(datamodel); 


        }

【问题讨论】:

    标签: java swing jtable


    【解决方案1】:

    “这告诉我列表中只有一个条目。我应该看到 4 个条目我看到的条目是我期望的 4 个条目中的最后一个。”

    每次迭代都会创建一个新的DefaultTableModel。不要那样做。

    DefaultTableModel datamodel = new DefaultTableModel(data,columnNames);
    resultsTable.setModel(datamodel);
    

    把上面的东西拿出来。相反,首先设置模型。然后只需 .addRow(row) 在循环中

    for (int column = 1; column <= columnCount; column++) {
         columnNames.add(metaData.getColumnName(column));
         System.out.println("ColumnNames "+columnNames );
    }
    DefaultTableModel datamodel = new DefaultTableModel(columnNames, 0);
    table.setModel(datamodel);
    
    while (resultSet.next()) {
        Vector<String> vector = new Vector<String>();
        for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
            vector.add(resultSet.getString(columnIndex)); 
        }
        datamodel.addRow(vector);
    }
    

    DefaultTableModel(columnNames, 0) 的构造函数,其中0 是初始行数。因此,您需要做的就是在while(rs.next()) 中一一动态地添加行。对于您在Vector 中获得的每一行数据,只需datamodal.addRow(vector)


    更新

    就像我说的,我不知道你做错了什么,但我的代码没有任何问题。这是一个测试程序

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.SQLException;
    import java.util.Vector;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.SwingUtilities;
    import javax.swing.table.DefaultTableModel;
    
    public class TestTableModel {
    
        private ResultSet resultSet = null;
    
        public TestTableModel() throws SQLException {
            initDB();
    
            JTable table = new JTable(getModel(resultSet));
            JScrollPane scroll = new JScrollPane(table);
    
            JFrame frame = new JFrame("Test Table Model");
            frame.add(scroll);
            frame.pack();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        TestTableModel testTableModel = new TestTableModel();
                    } catch (SQLException ex) {
                        ex.printStackTrace();
                    }
                }
            });
        }
    
        private DefaultTableModel getModel(ResultSet resultSet) throws SQLException {
            ResultSetMetaData metaData = resultSet.getMetaData();
            int columnCount = metaData.getColumnCount();
            Vector<String> columnNames = new Vector<>();
    
            for (int column = 1; column <= columnCount; column++) {
                columnNames.add(metaData.getColumnName(column));
                System.out.println("ColumnNames " + columnNames);
            }
            DefaultTableModel dataModel = new DefaultTableModel(columnNames, 0);
    
            while (resultSet.next()) {
                Vector<String> vector = new Vector<>();
                for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
                    vector.add(resultSet.getString(columnIndex));
                }
                dataModel.addRow(vector);
            }
    
    
            return dataModel;
        }
    
        private void initDB() throws SQLException {
            Connection conn = null;
            PreparedStatement ps = null;
            try {
                Class.forName("com.mysql.jdbc.Driver");
                conn = DriverManager.getConnection(
                        "jdbc:mysql://localhost/...", "...", "...");
                ps = conn.prepareStatement("SELECT * FROM city");
                resultSet = ps.executeQuery();
    
            } catch (ClassNotFoundException | SQLException ex) {
                ex.printStackTrace();
            } 
    
        }
    }
    

    【讨论】:

    • 抱歉 Peeskillet 不高兴。仍然得到相同的答案,只返回一个条目。
    • 那么您的代码中还有其他错误,您没有向我们展示。这种方式每次都适合我。
    • 查看我的更新。您需要检查代码中的其他地方,因为我的代码很好
    • @user3240355 peeskillet 的分析是正确的。这可能表明您正在更新错误的 JTable 实例
    • 谢谢各位,让我进一步研究一下。 Peeskillet 我已经尝试过您的应用程序,即使使用我的 MS Access 数据库,它也能完美运行。一个问题,你们中的任何一个人在使用带有现有 Jtable 的 DefaultTableModel 时遇到过任何问题吗??
    猜你喜欢
    • 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
    相关资源
    最近更新 更多