2

データベースからのデータを表示するように設計された独自のTableModel実装がありSQLます。arraylist<Object[]>列名に文字列配列、データにClass<?>[]、データベースから取得できるすべての異なるタイプの配列を使用して、必要なすべてのメソッドをオーバーライドしました。また、編集可能な列と編集不可能な列を指定するブール配列もあります。テーブル内のすべてをオブジェクトとして保存し、型の部分をまだ実装していなかった前は、うまく機能していました。モデルに型を追加したので、その列がブール配列で編集可能であっても、int型の列を編集することはできません。私はオーバーライドしましたisEditable()そのブール配列から値を返すだけのメソッドであり、問​​題のinto列でtrueを返しますが、それでも編集できません。これは動作を定義するものですか、それとも何か問題がありますか?電話を使用しているため、現時点ではコードを投稿できません。現在、ラップトップにはインターネット接続がなく、週末までインターネットに接続できません。私は検索しましたが、Googleはセルを編集可能または編集不可にすることについて多くの質問を表示するだけであり、int列を編集できない理由ではありません。編集:これが私の問題を示すペーストビンです:http://pastebin.com/cYJnyyqy

すべての列に対してtrueを返しますjdk7が、文字列列のみを使用して編集できます。isEditable()

4

2 に答える 2

3

うーん。int.classgetColumnClass()にraw型(例)を使用したことはありません。私はいつも「ラップされた」タイプを使用してきましたInteger.class

Class<?>[] typesプリミティブの代わりにラップされたクラスを使用するように変更してみてください 。例えば

 Class<?>[] types = {
            String.class,
            Character.class,
            Integer.class,
            ...

これは、Swingが正しいレンダラー/TableCellEditorを見つけるために必要になる場合があります。確信はないけど...

于 2012-07-08T15:48:48.770 に答える
3

フォローアップの質問への回答

  • charがまだ編集できないのはなぜですか

Reasonはデフォルトのジェネリックエディターです。パラメーターとしてStringを受け取るコンストラクターを持つクラスのみを処理できますが、Characterは処理できません。抜け道は、Characterクラス用の特定のカスタムエディターです。

JTable.GenericEditorがスローする場所は次のとおりです。

public Component getTableCellEditorComponent(JTable table, Object value,
                                         boolean isSelected,
                                         int row, int column) {
    this.value = null;
    ((JComponent)getComponent()).setBorder(new LineBorder(Color.black));
    try {
        Class<?> type = table.getColumnClass(column);
        // Since our obligation is to produce a value which is
        // assignable for the required type it is OK to use the
        // String constructor for columns which are declared
        // to contain Objects. A String is an Object.
        if (type == Object.class) {
            type = String.class;
        }

        // JW: following line fails  
        constructor = type.getConstructor(argTypes);
    }
    catch (Exception e) {
        // JW: so the editor returns a null
        return null;
    }
    return super.getTableCellEditorComponent(table, value, isSelected, row, column);
}

JTableがnullを処理する場所は次のとおりです。

// JTable.editCellAt(...)
TableCellEditor editor = getCellEditor(row, column);
if (editor != null && editor.isCellEditable(e)) {
    editorComp = prepareEditor(editor, row, column);
    if (editorComp == null) {
        // JW: back out if the comp is null
        removeEditor();
        return false;
    }
于 2012-07-08T16:28:49.037 に答える