【问题标题】:JTable with Thread throwing java.lang.ArrayIndexOutOfBoundsException带有线程的 JTable 抛出 java.lang.ArrayIndexOutOfBoundsException
【发布时间】:2016-01-07 18:37:55
【问题描述】:

我想使用线程修改我的 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();

例外!!!

at java.util.Vector.elementAt(Vector.java:474)
at javax.swing.table.DefaultTableModel.justifyRows(DefaultTableModel.java:265)
at javax.swing.table.DefaultTableModel.insertRow(DefaultTableModel.java:375)
at javax.swing.table.DefaultTableModel.addRow(DefaultTableModel.java:350)
at javax.swing.table.DefaultTableModel.addRow(DefaultTableModel.java:361)
at JA_JF_BinFileNumbers.JF_BinFileAndNumbers$80.run(JF_BinFileAndNumbers.java:9208)
at java.lang.Thread.run(Thread.java:745)

我想避免该错误...我正在考虑使用 Try Catch,但我的结果将不安全!!!

警察局: Populate JTable with large number of rows

使用 SwingWorker 不是唯一的答案...

【问题讨论】:

  • I was thinking to use a Try Catch but my results will not secure!!! 是什么意思?同样在您的回答中,更新组件仍由外螺纹不是 EDT。
  • 首先阅读thisthis
  • "PD:用大量行填充 JTable - 使用 SwingWorker 不是唯一的答案..." 你想要什么答案?在这种情况下,什么是 SwingWorker 不合适?它使用后台线程允许您通过publish/process 安全地填充表格和更新 UI,并防止您遇到异常?

标签: java multithreading swing


【解决方案1】:

更简单的解决方案。

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

【讨论】:

    猜你喜欢
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多