0

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

        }
Paul Samsotha
  • 205,037
  • 37
  • 486
  • 720
user28681
  • 3
  • 2

1 Answers1

2

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();
            }
        });
    }
}
Paul Samsotha
  • 205,037
  • 37
  • 486
  • 720