2012-01-03 3 views
2

私は組み込みJDBCデータベースに対して、ResultSetを使用して(JTextLabels EDIT:JTextFields)さまざまなタイプのデータ入力(整数、倍精度、文字列と日付)を受け入れました。私はカスタムAbstractTableModelを使用してスイングJTableで結果を表示しています。以下は私のコードからの抜粋です。どこに問題があるかもしれないと思っていますが、わかりません。 、それは次の例外を生成しますが、それでもスタックトレースdoesntのは、私のコードの任意の部分に私を指すsomwhere getValueAt()メソッドの周りにいるかのようにメソッドのgetValueAt()は、 "java.lang.IllegalArgumentException:指定されたObjectを数値としてフォーマットできません"を返します。どうして?

public void connectToDB() 
    { 
     try 
     { 
      connection = DriverManager.getConnection(DBURL, DBUSERNAME, DBPASSWORD); 
      statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); 
      connectedToDB = true; 
     } 
     catch (SQLException sqlEx) 
     { 
      sqlEx.printStackTrace(); 
     } 
    } 

//Overrides AbstractTableModel's getValueAt() method 
    public Object getValueAt(int row, int column) throws IllegalStateException 
    { 
     connectToDB(); 
     if (connectedToDB == false) 
      throw new IllegalStateException ("Not Connected To database"); 
     else 
     { 
      try 
      { 
       if (resultSet.next() == true) 
       { 
        resultSet.absolute(row + 1); 
        return resultSet.getObject(column + 1); 
       } 
      } 
      catch (SQLException sqlEx) 
      { 
       sqlEx.printStackTrace(); 
      } 
     } 
     return "";// returns an empty string Object in case an error occurs above 
    } 

は、それは見えます。

 
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Cannot format given Object as a Number 
    at java.text.DecimalFormat.format(DecimalFormat.java:487) 
    at java.text.Format.format(Format.java:140) 
    at javax.swing.JTable$DoubleRenderer.setValue(JTable.java:5315) 
    at javax.swing.table.DefaultTableCellRenderer.getTableCellRendererComponent(DefaultTableCellRenderer.java:223) 
    at javax.swing.JTable.prepareRenderer(JTable.java:5683) 
    at javax.swing.JTable.getToolTipText(JTable.java:3328) 
............ 
*Others ommitted 4 brevity* 
............ 

私はその理由を知りません。

+0

「JTextLabel」とは何ですか?私はJava 7のJ2SE [class listing](http://docs.oracle.com/javase/7/docs/api/allclasses-frame.html)には表示されません。 –

+0

Lolz ... cldnt help何の後ろにコメントする?(1年?)lmao!急いで厄介な入力ミス...私は実際には、JTextField、myBadを意味しました! – CodeBurner

答えて

2

stacktraceは、問題がテーブルのレンダラにあることを示します。 JTableは、特定の値に対してDoubleRendererを使用し、その値をDoubleに解析できないと判断しました。 TableModel#getColumnClassの実装を確認し、どのレンダラーを使用するかを決定する方法であるため、実際にはDoubleが含まれていない列に対してはDouble.classを返すかどうかを確認することをお勧めします。

これは、JTablesource code、より具体的にはgetRendererの方法で見ることができる。関連する部分については下記を参照してください(リンク先のソースコードの3454行目)

TableCellRenderer renderer = null; 
if (columnModel.getColumnCount() > 0) 
    renderer = columnModel.getColumn(column).getCellRenderer(); 
if (renderer == null) 
    { 
    int mcolumn = convertColumnIndexToModel(column); 
    renderer = getDefaultRenderer(dataModel.getColumnClass(mcolumn)); 
    } 
return renderer; 
+0

@ Robin - ありがとう。あなたが正しいと思います。 &私は以前のウォークアラウンドの代替案を見つけたにもかかわらず、私はより良い実装を与えるかどうかを確認するためにあなたの提案に従います。私はあなたにすぐに改善があることを知らせます。あなたは本当に役に立ちました。 – CodeBurner

0

ここまでで、java.text.DecimalFormat.format()と呼んでいるものは、そこに渡されているものを見てください。それが何であれ、DecimalFormatクラスが処理できるものではありません。

そのクラスとメソッドを直接呼び出さない場合は、ステップデバッガがあなたの親友です。 break pointDecimalFormat.format()に設定し、ステップデバッガを使用して、渡されているものが不正な引数であることを確認します。

+0

@ Robin - ありがとう。あなたが正しいと思います。 &私は以前のウォークアラウンドの代替案を見つけたにもかかわらず、私はより良い実装を与えるかどうかを確認するためにあなたの提案に従います。私はあなたにすぐに改善があることを知らせます。あなたは本当に役に立ちました。 – CodeBurner

+0

はい。本当に私はクラスメソッドを直接呼び出すことはできません。 Robinはこのステップデバッガと一緒に使うつもりな提案を私にくれました。うまくいけばうまくいくでしょう。ヒントをありがとう! – CodeBurner

関連する問題