【问题标题】:Recreate table java issue重新创建表java问题
【发布时间】:2014-08-26 22:34:00
【问题描述】:

每次调用 please() 时,我都无法重新填充我的表。

它不断添加到现有行中,这不是我想要的。

我想从我的model2 重新填充表格基础。每次please() 被调用时,有人能帮我重新创建表格吗?我的错误是 model2.addRow(please) 被称为...

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.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;
import java.util.Vector;
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 {

    String rowdata[] = new String[8];

    Date[] date123 = new Date[8];
    Date[] date1234 = new Date[8];

    String[] ddd = new String[8];

    static Calendar time1 = Calendar.getInstance();
    static Calendar time2 = Calendar.getInstance();

    Calendar time3[] = new Calendar[8];

    Calendar cal8 = Calendar.getInstance();

    Date date = new Date();

    DefaultTableModel model2 = new DefaultTableModel();

    static int count = 0;
    static boolean state = true;

    private SimpleDateFormat format = new SimpleDateFormat("HH:mm: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);

        Calendar cal1 = new GregorianCalendar();

        cal1.add(Calendar.SECOND, 5);

        date = cal1.getTime();

        cal8.setTime(date);

    }

    private TableModel getTableModel() {
        String[] cols = {"Time", "Is Seconds Even", "tttt"};
        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};
    }

    public void please() {

        while (state == true) {

            System.out.println(model2.getRowCount());

            Calendar cal = new GregorianCalendar();
            cal.add(Calendar.HOUR_OF_DAY, - 5);

            Calendar cal2 = new GregorianCalendar();
            cal2.add(Calendar.HOUR_OF_DAY, 7);

            Date date2 = cal.getTime();
            Date date3 = cal2.getTime();

            Date date1 = new Date();

            SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss a");

            Date d1[] = new Date[8];

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

            String rod = sdf2.format(date2);
            String rod1 = sdf2.format(date3);

            Calendar time1 = Calendar.getInstance();
            Calendar time2 = Calendar.getInstance();

            try {
                time1.setTime(sdf2.parse(rod));
                time2.setTime(sdf2.parse(rod1));

                time1.setTimeZone(TimeZone.getTimeZone("MDT"));
                time2.setTimeZone(TimeZone.getTimeZone("MDT"));

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

            Vector<String> please = new Vector<String>();

            for (int i = 0; i < 8; i++) {
                try {
                    d1[i] = sdf.parse(rowdata[i]);
                    ddd[i] = sdf2.format(d1[i]);
                    time3[i] = Calendar.getInstance();
                    time3[i].setTime(sdf2.parse(ddd[i]));
                    time3[i].setTimeZone(TimeZone.getTimeZone("MDT"));

                    count++;

                    if (time3[i].after(time1) && time3[i].before(time2)) {
                        Vector please2 = new Vector();
                        String exp = time3[i].getTime().toString();
                        Date ddddd = time3[i].getTime();
                        String dddd = format.format(ddddd);
                        please2.add(dddd);
                        model2.addRow(please2);
                    }
                } catch (ParseException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }

            if (count == 8) {
                state = false;
            }
        }
    }

    public void remove() {
        for (int i = 0; i < model2.getRowCount(); i++) {
            model2.removeRow(i);
        }
    }

    private class TimerListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            DefaultTableModel model = (DefaultTableModel) table.getModel();

            model2 = model;

            String array1[] = {"08-10-2014 08:26:00 PM", "12-15-2001 10:18:54 PM"};
            String array2[] = {"08-19-2014 01:18:27 AM", "01-19-2019 01:28:36 PM"};
            String array3[] = {"08-05-2014 05:18:57 PM", "08-25-1989 09:18:27 PM"};
            String array4[] = {"08-15-2014 08:23:35 PM", "10-25-1985 06:48:27 AM"};
            String array5[] = {"08-10-2014 06:00:00 PM", "05-16-2011 03:29:10 AM"};
            String array6[] = {"08-25-2014 09:14:08 PM", "11-22-2010 07:00:56 PM"};
            String array7[] = {"08-26-2014 09:09:17 PM", "02-05-1969 01:18:17 AM"};
            String array8[] = {"08-19-2014 10:02:15 PM", "12-09-2010 05:09:10 PM"};
            String[] p = {"L", "S", "R", "T", "D", "C", "L", "R"};
            String[] names = {"john", "doe", "moses", "roddrick", "pgmm", "pop", "Don", "Sandia"};

            boolean[] t3;

            int count2 = 0;

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

            please();

            Date pop = new Date();

            System.out.println(format.format(pop));
            System.out.println(format.format(date));

            if (format.format(pop).equals(format.format(date))) {
                Calendar cal1 = new GregorianCalendar();
                cal1.add(Calendar.SECOND, 5);
                date = cal1.getTime();
                System.out.println("My Lord");
                state = true;
                count = 0;
                remove();
                please();
            }
        }
    }

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

【问题讨论】:

  • while-loop 看起来很麻烦...
  • while 循环没问题。每次调用 please 函数时,我的表都不会重新创建。它不断地添加和添加
  • @ddd:while 循环绝不是“好”。您正在跨过 Swing 事件线程。在你知道你的 bug 来自哪里之前,不要假设一切都很好,否则你会阻碍你的进步。
  • remove 方法也是错误的,因为它不可能删除所有行,而应该使用while (model2.getRowCount() != 0) { model2.remove(0); }
  • 在您的while-loop 中,count 值不会在循环开始之前重置,这意味着如果您不小心,循环可能会以无限状态结束.你应该使用while (count &lt; 8) {...} 或类似的东西来防范它......

标签: java swing jtable


【解决方案1】:

在您的please 方法中,创建TableModel 的新实例,填充它,然后将其应用于您的JTable,例如...

public void please() {

    String[] cols = {"Time", "Is Seconds Even", "tttt"};
    model2 = new DefaultTableModel(cols, 0);
    while (state == true) {
        //...
    }

    table.setModel(model2);
}

这很危险……

while (state == true) {
    //..
    if (count == 8) {
        state = false;
    }
}

您依赖于外部值的状态,但在开始循环之前没有检查它,如果 count9 会发生什么?

相反,您应该做一些更像...的事情

while (count < 9) {
    //..
}

或者将count 值传递到方法中或在内部自行重置

你的remove方法也错了……

public void remove() {
    for (int i = 0; i < model2.getRowCount(); i++) {
        model2.removeRow(i);
    }
}

您不应该移动i,因为i 可能不再存在

  • rowCount = 5,删除0
  • rowCount = 4,删除1
  • rowCount = 3,删除2
  • rowCount = 2,删除3...这里有问题...

相反,您应该始终删除第一个元素

public void remove() {
    while (model2.getRowCount() > 0) {
        model2.removeRow(0);
    }
}

另外,因为您使用的是DefaultTableModel,所以您可以只使用model2.setRowCount(0);

【讨论】:

  • 当我调用 table.setModel(model2) 时,框架中没有显示任何内容
  • 我为您提供了代码。你介意修改一下吗
  • 实际上,是的,我会介意。我不是编码服务,也不是调试服务。您的 please 方法中存在逻辑错误,允许将时间值 (time3) 括在 time1time2 范围之外。因为我不知道你想要达到什么目的或为什么,所以不可能有更多人提出建议。以此为契机来锻炼您的调试技能。添加一些System.out.println 语句以查看值是什么,甚至在其上运行调试器。上面详细说明了改进代码的基本要求...
  • @MadProgrammer 这样的人不值得你花时间和宝贵的建议。这个人只是发布 qns 假设有人被雇用来解决他的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
  • 2021-02-01
  • 1970-01-01
相关资源
最近更新 更多