自动更新JTable [英] Update JTable automically

查看:85
本文介绍了自动更新JTable的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

JTable如何根据时间自动更新?因此,每次当前时间更改时,该表都会自动更新.可以提供一些代码片段说明如何在Java中工作吗?时间更改后要更新表.请先谢谢你.

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

推荐答案

只需使用Swing计时器,就像我在评论中提到的那样.您需要为Timer提供一个ActionListener,每隔这么多毫秒(无论您在构造函数中提供的第一个参数是什么)都调用一次ActionListener.在那里,您将使用新的Date或格式化的日期(如我在下面的示例中所做的那样)更新表模型,并根据该日期更改表中的任何数据.

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.

请参见如何使用摆动计时器

免责声明:我对此表示怀疑.为什么我在格式中使用dd?那不应该在那里.它应该是"HH:mm:ss".我懒得更改它.

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.

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

这篇关于自动更新JTable的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆