【问题标题】:How display in JTable the data from MySQL如何在 JTable 中显示 MySQL 中的数据
【发布时间】:2018-02-04 09:23:57
【问题描述】:

我想在 JTable 中显示来自 MySQL 的数据,但显示了表中的最后一行,没有更多内容。请帮帮我。我知道我有一个问题,因为 jt = new JTable(data, columns) 每次为每一行创建一个新表(删除前一个),但我找不到正确的选项。

public class Test2  extends JPanel {

    static final String USERNAME = "root";
    static final String PASSWORD = "root";
    static final String CONN_STRING = "jdbc:mysql://localhost:3306/mydbtest?useSSL=false";

    JTable jt;
    public Test2 () {

        try {
            Connection conn;
            conn = DriverManager.getConnection(CONN_STRING, USERNAME, PASSWORD);
            Statement stmt = (Statement) conn.createStatement();
            String query = "Select title, season, episode from movie";
            ResultSet rs = stmt.executeQuery(query);

            rs.beforeFirst();

            while (rs.next()) {
                String title = rs.getString("Title");
                String season = rs.getString("Season");
                String episode = rs.getString("Episode");

            String[] columns = {"Title", "S", "E"};
            String[][] data = {{title, season, episode}};


            jt = new JTable(data, columns);
            };

            jt.setPreferredScrollableViewportSize(new Dimension(450, 63));
            jt.setFillsViewportHeight(true);

            JScrollPane jps = new JScrollPane(jt);
            add(jps);
        }
        catch (Exception er) {System.err.println(er);}
    }

    public static void main(String[] args) {
        JFrame jf = new JFrame();
        Test2 t = new Test2();
        jf.setTitle("Test");
        jf.setSize(500,500);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.add(t);
    }
}

【问题讨论】:

    标签: java mysql swing jtable


    【解决方案1】:

    你的问题在这里:

    while (rs.next()) {
        String title = rs.getString("Title");
        String season = rs.getString("Season");
        String episode = rs.getString("Episode");
    
        String[] columns = { "Title", "S", "E" };
        String[][] data = { { title, season, episode } };
    
        jt = new JTable(data, columns); // *** you're making many JTables here!! ***
    }
    

    每次 while 循环循环时,您都会创建丢弃一个新的 JTable 对象。异常是在最后一次循环时,结果集最后一行的数据没有被丢弃,然后显示在最终创建的 JTable 中。为了解决这个问题,要显示JTable中的所有数据,您需要在while循环中整理所有结果集数据,然后将其添加到JTable中,这是最简单的方法这是创建一个表模型,这里是一个简单的 DefaultTableModel, while 循环之前,并在 while 循环内的每一行结果集数据中填充它:

    // create a table model with the appropriate column headers
    // and with 0 rows (to start with)
    String[] columnNames = {"Title", "Season", "Episode"};
    DefaultTableModel tableModel = new DefaultTableModel(columnNames, 0);
    
    while (rs.next()) {
        String title = rs.getString("Title");
        String season = rs.getString("Season");
        String episode = rs.getString("Episode");
    
        // create a single array of one row's worth of data
        String[] data = { title, season, episode } ;
    
        // and add this row of data into the table model
        tableModel.addRow(data);
    }
    
    jt.setModel(tableModel); // place model into JTable
    

    或者更好,将最后一行更改为:

    jt = new JTable(tableModel); // to create a new JTable
    

    【讨论】:

    • 这个想法非常聪明,但现在显示错误 java.lang.NullPointerException。什么原因?
    • @Yevgen:这是一个单独的问题,您应该调试它。如果您还没有这样做,请查看有关此主题的规范问题的答案:What is a NullPointerException, and how do I fix it?
    • @Yevgen:调试 NullPointerException 的启发式方法几乎总是相同的:您应该认真阅读异常的堆栈跟踪以找到出错的代码行,即引发异常的行,然后检查仔细检查一下,找出哪个变量为空,然后回溯到您的代码中查看原因。你会一次又一次地遇到这些,相信我。
    • @Yevgen:啊,你在更新的代码中调用new JTable(...)吗?你需要这样做。也许将jt.setModel(tableModel); 更改为jt = new JTable(tableModel);
    • 是的,原因就在这里。感谢您,我现在开始了解错误 NPE 的原因。
    【解决方案2】:

    试试这个......你可以轻松做到......

    public final void EmployeeGridView(){
    
        try{
    
            Connection conn = DBConn.connect();
            PreparedStatement ps = conn.prepareStatement("Select * from empdetails");
            ResultSet rs=ps.executeQuery();
            DefaultTableModel tm = (DefaultTableModel)jTable1.getModel();
            tm.setRowCount(0);
    
            while(rs.next()){
    
                Object o[] = {rs.getInt("EMPID"),rs.getString("FirstName"),rs.getString("LastName"),rs.getString("Designation"),rs.getString("NIC"),rs.getString("PhoneNO"),rs.getString("DOB"),rs.getString("Address"),rs.getString("Gender")};
                tm.addRow(o);
    
    
    
            }
    
    
        }
        catch(Exception e){
    
            JOptionPane.showMessageDialog(null,"Error in Employee Grid View..... "+e);
        }
    
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 1970-01-01
      • 2017-06-07
      • 2014-05-06
      • 2013-12-18
      • 2011-07-18
      • 1970-01-01
      相关资源
      最近更新 更多