How to “animate” the adding of rows to a JTable

前端 未结 1 812
梦毁少年i
梦毁少年i 2021-01-26 12:33

I want to display the JTable each time a row is added. The code that i write below add a new row to table , then display the jtable for 2 seconds ,then add another row , then di

相关标签:
1条回答
  • 2021-01-26 12:51

    You're creating a new JTable in each iteration, you don't need to do that. Add the model to the table before the loop. And just add rows to the model in the loop

    DefaultTableModel model = new DefaultTableModel(columnNames, 0);
    JTable table = new JTable(model);
    
    table.setEnabled(false);
    JTableHeader header1 = table.getTableHeader();
    header1.setResizingAllowed(false);
    header1.setReorderingAllowed(false);
    header1.setForeground(Color.white);
    header1.setBackground(Color.black); 
    jpanedisplay.setViewportView(table1);           
    jpanedisplay.getViewport().setBackground(Color.white);
    jpanedisplay.setBorder(BorderFactory.createLineBorder(Color.black));
    
    ...
    
    while(rs.next()){
         Vector<Object> rowVector = new Vector<Object>();
         for(int i=1;i<=columnCount;i++){
             rowVector.add(rs.getString(i));
                //System.out.print(rs.getString(i));
         }
         model.addRow(rowVector);
    
         // DON'T CALL Thread.sleep();
    }
    

    UPDATE

    If you dont want the table added until the database task is finished, just use a method

    private JTable createTable(ResultSet rs) {
        DefaultTableModel model = new DefaultTableModel(columnNames, 0);
        JTable table = new JTable(model);
    
        table.setEnabled(false);
        JTableHeader header1 = table.getTableHeader();
        header1.setResizingAllowed(false);
        header1.setReorderingAllowed(false);
        header1.setForeground(Color.white);
        header1.setBackground(Color.black);
    
        while(rs.next()){
            Vector<Object> rowVector = new Vector<Object>();
            for(int i=1;i<=columnCount;i++){
                rowVector.add(rs.getString(i));
    
            }
            model.addRow(rowVector);
        }
    
        return table;
    }
    

    Then you can just add it to what ever panel

    panel.add(new JScrollPane(createTable(rs));
    

    UPDATE #2

    after Op explained that they were trying to get a dynamic look the rows being added, instead of all at One time.

    I used a java.swing.Timer to add the rows.

    enter image description here

    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.SwingUtilities;
    import javax.swing.Timer;
    import javax.swing.table.DefaultTableModel;
    
    public class TestTimerTable {
    
        String[] cols = {"ID", "Name", "Country Code", "District", "Population"};
        DefaultTableModel model = new DefaultTableModel(cols, 0);
        JTable table = new JTable(model);
        ResultSet rs = null;
        JButton start = new JButton("Start");
        Timer timer = new Timer(0, null);
    
        public TestTimerTable() {
            initDB();
    
            JScrollPane scroll = new JScrollPane(table);
            scroll.setViewportView(table);
    
            JFrame frame = new JFrame("Test Timer Table");
            frame.add(scroll);
            frame.add(start, BorderLayout.SOUTH);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
    
            timer = new Timer(200, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    try {
                        if (rs.next()) {
                            String s1 = rs.getString(1);
                            String s2 = rs.getString(2);
                            String s3 = rs.getString(3);
                            String s4 = rs.getString(4);
                            String s5 = rs.getString(5);
                            model.addRow(new Object[]{s1, s2, s3, s4, s5});
                        } else {
                            ((Timer) e.getSource()).stop();
                        }
                    } catch (SQLException ex) {
                        ex.printStackTrace();
                    }
                }
            });
            start.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    timer.start();
                }
            });
        }
    
        private void initDB() {
            try {
                Class.forName("com.mysql.jdbc.Driver");
                Connection conn = DriverManager.getConnection(
                        "jdbc:mysql://localhost/...", "...", "...");
                PreparedStatement ps = conn.prepareStatement("SELECT *  FROM city");
                rs = ps.executeQuery();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new TestTimerTable();
                }
            });
        }
    }
    
    0 讨论(0)
提交回复
热议问题