0

さて、jFrameにjTableを追加しようとしていますが、データベーステーブルのレコードをjTableに表示したいと思います。

jTableを作成し(コンストラクターにコードを入れました)、表示する値を手動でコードに入力することができました。機能した。しかし、データベースからデータを取得するメソッドを呼び出して、それらをjtable内に表示しようとすると。「NullPointerException」というエラーが表示されます。

テーブルを作成するコンストラクターのCODE:

    String[] columnname = {"Subject Code", "Prelim", "Midterm", "SemiFinal", "Finals"};
    setTable();
    Object[][] data = {};

    gradetable = new JTable(data, columnname){
        public boolean isCellEditable(int data, int columns){
            return false;
        }

        public Component prepareRenderer(TableCellRenderer r, int data, int columns){
            Component c = super.prepareRenderer(r, data, columns);

            if (data % 2 == 0){
                c.setBackground(Color.GRAY);
            }
            else{
                c.setBackground(Color.WHITE);
            }

            if (isCellSelected(data, columns)){
                c.setBackground(Color.ORANGE);
            }
            return c;
        }
    };
    gradetable.setPreferredScrollableViewportSize(new Dimension (400, 150));
    gradetable.setFillsViewportHeight(true);
    jsp = new JScrollPane(gradetable);

データベースからデータを取得してテーブルに追加するために使用した方法:

private void setTable(){
    DefaultTableModel model = (DefaultTableModel)gradetable.getModel();
    try
    {
        Class.forName("com.mysql.jdbc.Driver");            
        Connection con = (Connection)DriverManager.getConnection("jdbc:mysql://localhost:3306/grading","root","");
        Statement st = con.createStatement();      
        String sql = "SELECT * FROM student INNER JOIN grade ON student.idnumber = grade.idnumber WHERE student.idnumber = '2010-00125'";
        ResultSet rs = st.executeQuery(sql);
        model.setRowCount(0);
        while (rs.next()){

            //this.setName(rs.getString("name"));
            //this.setCourse(rs.getString("course"));
            //this.setYear(rs.getString("year"));

            String d1, d2, d4, d3, d5;

            d1 = rs.getString("subjectcode");
            d2 = rs.getString("prelim");
            d3 = rs.getString("midterm");
            d4 = rs.getString("semifinal");
            d5 = rs.getString("finals");

            model.addRow(new Object[]{d1,d2,d3,d4,d5});
        }           
        rs.close();
        con.close();
    }catch(ClassNotFoundException | SQLException ex){
            JOptionPane.showMessageDialog(null, ex);            
    }
}
4

1 に答える 1

1

の理由は、ここでモデルを取得しようとするNPE呼び出しを行っているためです。setTableJTable

DefaultTableModel model = (DefaultTableModel)gradetable.getModel();

これは、実際に をインスタンス化するgradetableであるため、NPEがスローされます。

これとは別にDefaultTableModel、 のモデルを設定するときに を使用する必要がありJTableます。そうしないと、ClassCastExceptionこの行に が表示されます。

于 2013-02-24T11:27:57.223 に答える