简体   繁体   中英

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

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 display the table. But the jtable is not displaying , It only display after adding all rows

        Vector<Object> rowVector = null;
        while(rs.next()){
            rowVector = new Vector<Object>();
            for(int i=1;i<=columnCount;i++){
                rowVector.add(rs.getString(i));
                //System.out.print(rs.getString(i));
            }

            System.out.println(rowVector.toString());
            //data.add(rowVector);
            model.addRow(rowVector);
            JTable table1 = new JTable(model);
            JTableHeader header1 = table1.getTableHeader();
            table1.setEnabled(false);
            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));
            Thread.sleep(3000);

        }

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.

在此处输入图片说明

 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(); } }); } } 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM