import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;public class GameFrame extends JFrame{ int[] ta = new int[6];
JTable bill;
JScrollPane pn = new JScrollPane(bill); public GameFrame(){
this.setSize(800, 600);
this.setLocationRelativeTo(null);
this.setLayout(null);
bill = new JTable(fun(ta)){
public boolean isCellEditable(int rowIndex, int columnIndex){ 
return   false;  //设置单元格不可编辑
}
};
pn.setBounds(100, 100, 600, 400);
this.add(pn);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(false);
this.setVisible(true);

new Thread(new BillThread()).start();

} private class BillThread implements Runnable{
public void run() {
while(true){
bill.setModel(fun(ta));
pn.getViewport().add(bill,null);
pn.revalidate();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for(int i=0;i<6;i++)
ta[i] += 1;
}
}
} private DefaultTableModel fun(int[] a){
Object[] billTitle = {"标题1","标题2","标题3"}; //定义标题
Object[][] billTable = {
{a[0],a[1],a[2]},
{a[3],a[4],a[5]}
};
DefaultTableModel model;
model = new DefaultTableModel(billTable,billTitle); 
return model;
}

public static void main(String[] args) {
new GameFrame();
}}我需要做个表格,然后每1秒刷新一次,
为什么运行几秒后报错啊
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
at java.util.Vector.elementAt(Unknown Source)
at javax.swing.table.DefaultTableColumnModel.getColumn(Unknown Source)
at javax.swing.plaf.basic.BasicTableHeaderUI.getHeaderHeight(Unknown Source)
at javax.swing.plaf.basic.BasicTableHeaderUI.createHeaderSize(Unknown Source)
at javax.swing.plaf.basic.BasicTableHeaderUI.getPreferredSize(Unknown Source)
at javax.swing.JComponent.getPreferredSize(Unknown Source)
at javax.swing.ViewportLayout.preferredLayoutSize(Unknown Source)
at java.awt.Container.preferredSize(Unknown Source)
at java.awt.Container.getPreferredSize(Unknown Source)
at javax.swing.JComponent.getPreferredSize(Unknown Source)
at javax.swing.ScrollPaneLayout.layoutContainer(Unknown Source)
at java.awt.Container.layout(Unknown Source)
at java.awt.Container.doLayout(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validate(Unknown Source)
at javax.swing.RepaintManager.validateInvalidComponents(Unknown Source)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
好烦啊,求求各位好心的哥哥姐姐帮忙解决下

解决方案 »

  1.   

    ArrayIndexOutOfBoundsException:   数组越界了
      

  2.   

    ArrayIndexOutOfBoundsException看看那里调用的。
      

  3.   

    我也出错了,但是提示不一样
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at javax.swing.JComponent._paintImmediately(JComponent.java:5087)
    at javax.swing.JComponent.paintImmediately(JComponent.java:4882)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:785)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:713)
    at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:693)
    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:125)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:641)
    at java.awt.EventQueue.access$000(EventQueue.java:84)
    at java.awt.EventQueue$1.run(EventQueue.java:602)
    at java.awt.EventQueue$1.run(EventQueue.java:600)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:611)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
      

  4.   

    ArrayIndexOutOfBoundsException: 数组越界了调试调试
      

  5.   

     private class BillThread implements Runnable{
            public void run() {
                while(true){
                    bill.setModel(fun(ta));
                    pn.getViewport().add(bill,null);
                    pn.revalidate();
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    for(int i=0;i<6;i++)
                        ta[i] += 1;
                }
            }
        }这个方法 继承改下 
    private class BillThread extends Thread {
    public void run() {
    while (true) {
    bill.setModel(fun(ta));
    pn.getViewport().add(bill, null);
    pn.revalidate();
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    for (int i = 0; i < 6; i++)
    ta[i] += 1;
    }
    }
    }
      

  6.   

    回复 kiss601459202
            (ccc)一样还是报错
      

  7.   

    kiss601459202 说对了, 为什么捏
      

  8.   

    不是吧,我用的是eclipse-SDK-3.4.1,运气好运行20多秒才报错,运气不好运行1,2秒就报错了
      

  9.   

    我觉得问题应该是出在一直不停得去add组件上 
      

  10.   

    恩,我也这样觉得 pn.getViewport().add(bill, null);这行代码有问题,
    就是不知怎么解决这个问题。
      

  11.   

    public void run() {
    while (true) {
    bill.setModel(fun(ta));
    pn.getViewport().add(bill, null);
    pn.revalidate();
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    for (int i = 0; i < 6; i++)
    ta[i] += 1;
    pn.remove(bill);
    }
    }
    试试
      

  12.   

    不行的
    听说这个是Swing自己在绘制表格时报的错 
    你将表格的数据改变,然后fire事件通知swing;   swing会在Thread中绘制. 
    但是Swing是线程不安全的.这个错误很可能是因为你在不安全的地方操作了Table的数据. 
      

  13.   

    这个错误是典型的SWING多线程调用的问题,需要程序员自己同步线程
      

  14.   

    我把程序改了 测试这个看看 跑了500没异常
    package test.problem;import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
    import java.util.List;import javax.swing.*;public class GameFrame extends JFrame {
    private static final long serialVersionUID = 1L;
    JLabel bill;
    List<JLabel> list = new ArrayList<JLabel>(); public GameFrame() {
    this.setSize(800, 600);
    this.setLocationRelativeTo(null);
    this.setLayout(new FlowLayout());
    for (int i = 0; i < 6; i++) {
    bill = new JLabel();
    this.add(bill);
    list.add(bill);
    }
    JButton b = new JButton("start");
    this.add(b);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setResizable(false);
    this.setVisible(true);
    b.addActionListener(new ActionListener() { @Override
    public void actionPerformed(ActionEvent e) {
    new BillThread(list).start();
    }
    }); } class BillThread extends Thread {
    private List<JLabel> l = null; public BillThread(List<JLabel> list) {
    this.l = list;
    } public void run() {
    int i = 0;
    while (true) {
    try {
    for (JLabel jl : l)
    jl.setText(i + "");
    i++;
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    } public static void main(String[] args) {
    new GameFrame();
    }}
      

  15.   

    建议楼主认真看看SWING的多线程同步那一块,否则以后还会遇到这种莫名其妙的的问题,对于你这个具体的例子,建议使用javax.swing.Timer这个定时器进行处理,这个Timer处理的时候能够保证线程同步,不会出现线程冲突以及不可预料的问题,同时看看SWING的线程处理机制
    下面这个是给你改的还是用JTable,没有简化为JLabel,应该是没有问题了
    import javax.swing.*;
    import javax.swing.table.DefaultTableModel;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;public class GameFrame extends JFrame{    int[] ta = new int[6];
        JTable bill;
        JScrollPane pn = new JScrollPane(bill);    private Timer timer=null;//added by ioe_gaoyong    private class TableListener implements ActionListener {        @Override
            public void actionPerformed(ActionEvent e) {
                //To change body of implemented methods use File | Settings | File Templates.
                    bill.setModel(fun(ta));
                    pn.getViewport().add(bill,null);
                    pn.revalidate();
                    
                    for(int i=0;i<6;i++)
                        ta[i] += 1;
            }
        }    public GameFrame(){
            this.setSize(800, 600);
            this.setLocationRelativeTo(null);
            this.setLayout(null);
            bill = new JTable(fun(ta)){
                public boolean isCellEditable(int rowIndex, int columnIndex){
                    return   false;  //设置单元格不可编辑
                }
            };
            pn.setBounds(100, 100, 600, 400);
            this.add(pn);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setResizable(false);
            this.setVisible(true);        timer=new Timer(1000,new TableListener());
            timer.start();
        }//    private class BillThread implements Runnable{
    //        public void run() {
    //            while(true){
    //                bill.setModel(fun(ta));
    //                pn.getViewport().add(bill,null);
    //                pn.revalidate();
    //                try {
    //                    Thread.sleep(1000);
    //                } catch (InterruptedException e) {
    //                    e.printStackTrace();
    //                }
    //                for(int i=0;i<6;i++)
    //                    ta[i] += 1;
    //            }
    //        }
    //    }    private DefaultTableModel fun(int[] a){
            Object[] billTitle = {"标题1","标题2","标题3"}; //定义标题
            Object[][] billTable = {
                    {a[0],a[1],a[2]},
                    {a[3],a[4],a[5]}
            };
            DefaultTableModel model;
            model = new DefaultTableModel(billTable,billTitle);
            return model;
        }    public static void main(String[] args) {
            new GameFrame();
        }}
      

  16.   


    Swing是线程安全的,你用不安全的Timer去控制安全的组件,你说结果是否是安全的呢?
      

  17.   

    我用Timer了 ????楼上说笑呢?
      

  18.   

    结贴了,问题解决了,多谢kiss601459202和ioe_gaoyong(风尘中国)