具有线程抛出java.lang.ArrayIndexOutOfBoundsException的JTable

具有线程抛出java.lang.ArrayIndexOutOfBoundsException的JTable,java,multithreading,swing,Java,Multithreading,Swing,我想使用线程修改我的JTable,但有时我会获取java.lang.ArrayIndexOutOfBoundsException 这里是我的代码 //... Ini Declaration javax.swing.JTable theJfTable = new javax.swing.JTable(); theJfTable.setModel(new javax.swing.table.DefaultTableModel( new Object [][] { }, new Stri

我想使用线程修改我的JTable,但有时我会获取java.lang.ArrayIndexOutOfBoundsException

这里是我的代码

//... Ini Declaration
javax.swing.JTable theJfTable = new javax.swing.JTable();
theJfTable.setModel(new javax.swing.table.DefaultTableModel(
  new Object [][] {

  },
  new String [] {
    "Freqs", "Real", "Imag", "Mod", "Angle"
  }
));
//... End Declaration
我正在创建一个线程,因为这个过程需要很长时间!!! 我想避免我的程序被冻结,然后我会使用线程

  Runnable fillData = new Runnable() {
        public void run() {
            double[] bins = ... //  DoubleArrayWithSizeF;
            double[] Real = ... //  DoubleArrayWithSizeF;
            double[] Imag = ... //  DoubleArrayWithSizeF;
            double[] Mod = ... //  DoubleArrayWithSizeF;
            double[] Arg = ... //  DoubleArrayWithSizeF;

            int iSizeF = bins.length;

            ((DefaultTableModel) theJfTable.getModel()).setRowCount(0);
            for (int i = 0; i < iSizeF; i++) {
              ((DefaultTableModel) theJfTable.getModel()).addRow(new Object[]{ // Line 9208 Problem Here!!!!
                  String.format("%.2f", bins[i]),
                  String.format("%.2f", Real[i]),
                  String.format("%.2f", Imag[i]),
                  String.format("%.2f", Mod[i]),
                  String.format("%.2f", Arg[i])
              });
            }
        }
  };
  new Thread(fillData).start();
我想避免这个错误。。。我想用一个尝试捕捉,但我的结果将是不安全的

PD:

使用SwingWorker不是唯一的答案…

更简单的解决方案

  Runnable fillData = new Runnable() {
        public void run() {
            double[] bins = ... //  DoubleArrayWithSizeF;
            double[] Real = ... //  DoubleArrayWithSizeF;
            double[] Imag = ... //  DoubleArrayWithSizeF;
            double[] Mod = ... //  DoubleArrayWithSizeF;
            double[] Arg = ... //  DoubleArrayWithSizeF;

            int iSizeF = bins.length;

            Object[][] matrix = new Object[bins.length][5];
            for (int row = 0; row < matrix.length; row++) {
                matrix[row][0] = String.format("%.2f", bins[row]);
                matrix[row][1] = String.format("%.2f", Real[row]));
                matrix[row][2] = String.format("%.2f", Imag[row]));
                matrix[row][3] = String.format("%.2f", Mod[row]));
                matrix[row][4] = String.format("%.2f", Arg[row]);
            }
            String[] headers = {"Freqs", "Real", "Imag", "Mod", "Angle"};

            final DefaultTableModel dtm = new DefaultTableModel(matrix,headers);
            SwingUtilities.invokeLater(
                    new Runnable() {
                        @Override
                        public void run() {
                            theJfTable.setModel(dtm);
                        }
                    }
            );

        }
  };
  new Thread(fillData).start();
Runnable fillData=new Runnable(){
公开募捐{
double[]bin=…//DoubleArrayWithSizeF;
double[]Real=…//DoubleArrayWithSizeF;
double[]Imag=…//DoubleArrayWithSizeF;
double[]Mod=…//DoubleArrayWithSizeF;
double[]Arg=…//DoubleArrayWithSizeF;
int iSizeF=料仓长度;
对象[][]矩阵=新对象[bin.length][5];
对于(int row=0;row
我想用Try-Catch做什么,但结果不安全!!!是吗?同样在您的答案中,更新组件仍然是由外部线程而不是EDT完成的。首先,让另一个线程读取,然后查看“PD:用大量行填充JTable-使用SwingWorker不是唯一的答案…”以及您想要的答案是什么?在这种情况下,
SwingWorker
什么不合适?它使用一个后台线程,允许您通过
publish/process
安全地填充表格和更新UI,并将防止出现异常?
  Runnable fillData = new Runnable() {
        public void run() {
            double[] bins = ... //  DoubleArrayWithSizeF;
            double[] Real = ... //  DoubleArrayWithSizeF;
            double[] Imag = ... //  DoubleArrayWithSizeF;
            double[] Mod = ... //  DoubleArrayWithSizeF;
            double[] Arg = ... //  DoubleArrayWithSizeF;

            int iSizeF = bins.length;

            Object[][] matrix = new Object[bins.length][5];
            for (int row = 0; row < matrix.length; row++) {
                matrix[row][0] = String.format("%.2f", bins[row]);
                matrix[row][1] = String.format("%.2f", Real[row]));
                matrix[row][2] = String.format("%.2f", Imag[row]));
                matrix[row][3] = String.format("%.2f", Mod[row]));
                matrix[row][4] = String.format("%.2f", Arg[row]);
            }
            String[] headers = {"Freqs", "Real", "Imag", "Mod", "Angle"};

            final DefaultTableModel dtm = new DefaultTableModel(matrix,headers);
            SwingUtilities.invokeLater(
                    new Runnable() {
                        @Override
                        public void run() {
                            theJfTable.setModel(dtm);
                        }
                    }
            );

        }
  };
  new Thread(fillData).start();