java - jtable 仅从数据库返回一行

标签 java mysql swing

我希望表从数据库返回数据而不指定行数,我在默认表模型中使用了自动增量,但它不显示所有行,我必须在 Action 监听器之外定义表才能添加它到 JPanel,所以问题是我的表仅从数据库返回一行

int row = 1;
     Object [] colnames = {"year","term","balance"};
     JTable table4 = new JTable(new DefaultTableModel(colnames,++row));
     JScrollPane pane  = new JScrollPane(table4);





 saachs.addActionListener(new ActionListener(){

       public void actionPerformed(ActionEvent e) {
             String adm = adms.getText();
             int row = 0;

            Connection con = null;
            try {
                Class.forName("com.mysql.jdbc.Driver");
            } catch (ClassNotFoundException ex) {
                try {
                    throw new Exception ("driver not found");
                } catch (Exception e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
            String url = "jdbc:mysql://localhost/test";
              try {
                con = DriverManager.getConnection(url,"abda","abda");
            } catch (SQLException e1) {
                e1.printStackTrace();
            }if(con!=null){
                Statement st = null;
                ResultSet rs = null;
                String query = "select a.year,a.term,a.payable - b.total_paid balance from seet a join ( select adm, extract(year from date) tyear,class, term, sum(paid) total_paid from fees group by adm,class,term) b on a.class = b.class and b.adm = '"+adms.getText()+"' and a.term = b.term and a.year = b.tyear";

                try {
                    st = con.createStatement();
                } catch (SQLException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                try {
                    rs = st.executeQuery(query);
                } catch (SQLException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }

                try {
                    while(rs.next()){
                        table4.setValueAt(rs.getString(1),row,0);
                        table4.setValueAt(rs.getString(2),row,1);
                        table4.setValueAt(rs.getString(3),row,2);

                        row++;
                    }
                } catch (SQLException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }


        }

    });

最佳答案

不要直接使用 setValueAt(...) 设置 JTable 的值方法,而是在您的 actionPerformed(...) 中创建一个 DefaultTableModel 对象方法,并在你的 while (rs.next()) 内方法创建一个新的 Vector<String>您填充 ResultSet 当前行的数据,并在 while 循环结束时,通过调用此 Vector 的 addRow(Vector v) 将此 Vector 传递到您的模型中方法。然后通过调用表的 setModel(TableModel model) 将此模型传递到 JTable 中方法。

类似于:

   try {
      Object[] columnNames = { "year", "term", "balance" };
      DefaultTableModel model = new DefaultTableModel(columnNames, 0);
      while (rs.next()) {
         Vector<String> rowData = new Vector<>();
         rowData.add(rs.getString(1));
         rowData.add(rs.getString(2));
         rowData.add(rs.getString(3));
         row++;
         model.addRow(rowData);
      }
      table4.setModel(model);
   } catch (SQLException e1) {
      e1.printStackTrace();
   }

警告:代码尚未经过测试

关于java - jtable 仅从数据库返回一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30829334/

相关文章:

java - 矩形未绘制在顶部

java - 如何防止gradle下载SNAPSHOT jar

java - 从 servlet 运行繁重的 cmd 进程

mysql - 无法从三个表的值更新一个表(将三个表合并为一个)

mysql - 对于存在的列,Count 返回 0

java - 如何使用 Java Swing/awt 将标签放在面板内的单选按钮下

java - 安卓应用无法在后台运行

java - 寻找 Java 代码美化器(或者可能不是美化,而是使代码更优雅的东西)

php - MySQL 选择所有缺失的记录

java - 如何正确使用自定义渲染器绘制 JTable 中的特定单元格?