Search code examples
javaswingtimerjtable

Update JTable automically


How would a JTable update automatically based off of time? So every time the current time changes, the table updates automatically. Could some provide a snippet of code of how this may work in Java? To have the Table update after the time changes. Please and thank you in advance.

          package times;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

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;
import javax.swing.table.TableModel;

public class TableTimeChange {

DefaultTableModel model2 = new DefaultTableModel();

String rowdata[] = new String[8];
Date[] date123 = new Date[8];

private SimpleDateFormat format = new SimpleDateFormat("HH:mm:dd:ss");
private JTable table = new JTable(getTableModel());

public TableTimeChange() {
    table.setPreferredScrollableViewportSize(table.getPreferredSize());
    JFrame frame = new JFrame();
    frame.add(new JScrollPane(table));
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();

    Timer timer = new Timer(1000, new TimerListener());
    timer.start();
    frame.setVisible(true);
}

private TableModel getTableModel() {
    String[] cols = {"Time"};


    String array1[] = { "12-12-2001 10:18:30 PM", "12-15-2001 10:18:54 PM"};
    String array2[] = {"01-19-1989 01:18:27 AM", "01-19-2019 01:28:36 PM"};
    String array3[] = {"12-05-1989 05:18:57 PM", "08-25-1989 09:18:27 PM"};
    String array4[] = { "10-15-1985 09:18:17 AM", "10-25-1985 06:48:27 AM"};
    String array5[] = {"06-10-2001 03:09:19 AM", "05-16-2011 03:29:10 AM"};
    String array6[] = {"01-12-2000 09:00:08 PM", "11-22-2010 07:00:56 PM"};
    String array7[] = { "07-19-1969 12:18:47 PM", "02-05-1969 01:18:17 AM"};
    String array8[] = {"01-09-2010 10:09:50 AM", "12-09-2010 05:09:10 PM"};


    rowdata[0] = array1[0];
    rowdata[1] = array2[0];
    rowdata[2] = array3[0];
    rowdata[3] = array4[0];
    rowdata[4] = array5[0];
    rowdata[5] = array6[0];
    rowdata[6] = array7[0];
    rowdata[7] = array8[0];


    for(int t = 0; t<rowdata.length; t++)
    {

        DateFormat sdf = new SimpleDateFormat("MM-dd-yyyy hh:mm:ss a");
        DateFormat sdf3 = new SimpleDateFormat("MM-dd-yyyy hh:mm:ss a");


        try {

            date123[t] = sdf.parse(rowdata[t]);


        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    for(int i = 0; i<8; i++)
    {



    String[][] data = {{getFormatDate(date123[i])},{ getFormatDate(date123[i])}};
    DefaultTableModel model = new DefaultTableModel(data, cols);

   model2 = model;


    }


    return model2;
}

private String getFormatDate(Date date) {
    return format.format(date);
}

private class TimerListener implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        DefaultTableModel model = (DefaultTableModel)table.getModel();
        for (int i = model.getRowCount() -1; i >= 0; i--) {
            model.setValueAt(getFormatDate(date123[i]), i, 0);
        }   
    }
}

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            new TableTimeChange();
        }
    });
}
}

Solution

  • Just use a Swing Timer, like I mention in the comment. You need to provide an ActionListener to the Timer, of which the actionPerformed will be called every so many milliseconds (whatever you provide as the first argument in the constructor). There you will update the table model with the new Date or formatted date (As I did in the example below), and change whatever data in the table based on that date.

    See more at How to Use Swing Timers

    Disclaimer: I'm so out of it. Why the heck did I use dd in the format? That should not be there. It should be "HH:mm:ss". I'm too lazy to change it.

    enter image description here

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    
    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;
    import javax.swing.table.TableModel;
    
    public class TableTimeChange {
    
        private SimpleDateFormat format = new SimpleDateFormat("HH:mm:dd:ss");
        private JTable table = new JTable(getTableModel());
    
        public TableTimeChange() {
            table.setPreferredScrollableViewportSize(table.getPreferredSize());
            JFrame frame = new JFrame();
            frame.add(new JScrollPane(table));
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
    
            Timer timer = new Timer(1000, new TimerListener());
            timer.start();
            frame.setVisible(true);
        }
    
        private TableModel getTableModel() {
            String[] cols = {"Time", "Is Seconds Even"};
            Object[][] data = { { getNewRow() }, { getNewRow() } };
            DefaultTableModel model = new DefaultTableModel(data, cols);
            return model;
        }
    
        private String getFormatDate(Date date) {
            return format.format(date);
        }
    
        private Object[] getNewRow() {
            Calendar cal = Calendar.getInstance();
            int seconds = cal.get(Calendar.SECOND);
            boolean isSecondsEven = (seconds % 2 == 0);
            return new Object[] { getFormatDate(cal.getTime()), isSecondsEven };
        }
    
        private class TimerListener implements ActionListener {
    
            @Override
            public void actionPerformed(ActionEvent e) {
                DefaultTableModel model = (DefaultTableModel)table.getModel();
                for (int i = model.getRowCount() -1; i >= 0; i--) {
                    Object[] row = getNewRow();
                    model.setValueAt(row[0], i, 0);
                    model.setValueAt(row[1], i, 1);
                }   
            }
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    new TableTimeChange();
                }
            });
        }
    }