0

JTableに静的な2D配列を入力する必要があります。私はこのモデルを作成しましたJTable

 public class InsertMatToJTable extends AbstractTableModel{

   String titre[] = {"age real", "sex real", "chest real", "resting_blood_pressure real","serum_cholestoral real","fasting_blood_sugar real","resting_electrocardiographic_results real","maximum_heart_rate_achieved real","exercise_induced_angina real","oldpeak real","slope real","number_of_major_vessels real","thal real", "class"};

   String line;

    float mat[][]= new float[270][13];

    float matrice_normalise[][];

    int i = 0,j=0;

    public void InsertMatToJTable()
    {

try {
        FileInputStream fis = new FileInputStream("fichier.txt");
            BufferedReader br = new BufferedReader(new InputStreamReader(fis));

            while ((line = br.readLine()) != null) {
                            StringTokenizer st1 = new StringTokenizer(line, " ");
                            while (st1.hasMoreTokens())
                            {mat[i][j]=Float.valueOf(st1.nextToken()).floatValue(); 
                                                        j++;

                           if (st1.hasMoreTokens()!=true)   i++;
                            }      
            }
            br.close();
      }catch(Exception e) {
                    e.printStackTrace();}

      Normalisation norm = new Normalisation(mat);

   // for(i=0;i<270;i++)
    //{for(j=0; j<14;j++)
    //{matrice_normalise[i][j]=norm.mat_normalised[i][j];
    //}
      matrice_normalise=norm.mat_normalised;


    }
 @Override
   public int getRowCount() {
    return 270*13;
  }

 @Override
public int getColumnCount() {
    return 13;
}

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
    return  matrice_normalise[rowIndex][columnIndex];
}

public String getColumnName(int columnIndex) {
    return titre[columnIndex];

}
    }

基本的に、このコードはテキストファイルから読み取り、各行に13個の数値が含まれ、それらを静的マトリックスに格納してから、「正規化」と呼ばれる他の処理を適用します。

ここでの問題は「getValueAt」関数にあるようです。私は毎回このエラーがあります:

         Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
         at prodm.InsertMatToJTable.getValueAt(InsertMatToJTable.java:62)

まず、このコードが実際に私が思うことを実行するかどうかを知る必要があります。つまり、テキストファイルに格納されるのと同じ方法でデータをマトリックスに格納します。

そして第二に、getValueAt関数の何が問題になっているのか本当にわかりません。

また、私は何か他のものに気づきました。この部分には間違いなく何か問題があります:

  while ((line = br.readLine()) != null) {
                            StringTokenizer st1 = new StringTokenizer(line, " ");
                            while (st1.hasMoreTokens())
                            {mat[i][j]=Float.valueOf(st1.nextToken()).floatValue(); 
                                                        j++;
                                                       if (j==13) {i++;j=1;}
                            }  

ファイルから読み取りますが、データを本来の方法で保存しません。基本的には、2行目から「シフト」を導入します。たとえば、[1][0]に格納する必要があるのは[1][1]、[2][0]は[2][2]...などです。

4

1 に答える 1

2

問題は、あなたが書いたことです:

public void InsertMatToJTable()

しかし、次のように書くべきでした:

public InsertMatToJTable()

void2 番目のスニペットには no がないことに注意してください。

InsertMatToJTable同じ名前のクラスのコンストラクターではなく、呼び出されたメソッドを宣言しました。したがって、new InsertMatToJTable()呼び出すと、デフォルトの引数なしのコンストラクターが呼び出され、コードが実行されず、マトリックスが初期化されないままになるため、NullPointerException.

この種のタイプミスの問題を回避するには、コードにログを追加し、デバッガーを使用して問題を見つけます。

これは、動作するコードのサンプル デモです。

import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.AbstractTableModel;

public class TestTables {

    private static final int ROWS = 270;
    private static final String titre[] = { "age real", "sex real", "chest real", "resting_blood_pressure real", "serum_cholestoral real",
            "fasting_blood_sugar real", "resting_electrocardiographic_results real", "maximum_heart_rate_achieved real",
            "exercise_induced_angina real", "oldpeak real", "slope real", "number_of_major_vessels real", "thal real", "class" };

    public static class InsertMatToJTable extends AbstractTableModel {

        private float[][] matrice_normalise;

        public InsertMatToJTable(float[][] matrice_normalise) {
            this.matrice_normalise = matrice_normalise;
        }

        @Override
        public int getRowCount() {
            return matrice_normalise.length;
        }

        @Override
        public int getColumnCount() {
            return titre.length;
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            return matrice_normalise[rowIndex][columnIndex];
        }

        @Override
        public String getColumnName(int columnIndex) {
            return titre[columnIndex];

        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame(TestTables.class.getSimpleName());
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                float[][] matrix = new float[ROWS][titre.length];
                Random random = new Random();
                for (int i = 0; i < matrix.length; i++) {
                    for (int j = 0; j < matrix[i].length; j++) {
                        matrix[i][j] = random.nextFloat() * 100;
                    }
                }
                InsertMatToJTable model = new InsertMatToJTable(matrix);
                JTable table = new JTable(model);
                JScrollPane scroll = new JScrollPane(table);
                frame.add(scroll);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}
于 2012-11-25T22:45:40.813 に答える