2011-11-17 20 views
14

JTableの1つの列を編集可能にする方法が不思議でしたが、他の列は編集不可能でなければなりません。Java JTable - 1つの列のみを編集可能にする

私はisCellEditable()を上書きしましたが、これはすべてのセルを編集不可能に変更します。事前に Thnx

答えて

29

TableColumnためisEditableまたはTableColumn and TableCelltable model

isCellEditable(int rowIndex, int columnIndex)はちょうどあなたがしたい列に対してtrueを返し、二つの引数を取りすぎ

@Override 
public boolean isCellEditable(int row, int col) { 
    switch (col) { 
     case 0: 
     case 1: 
      return true; 
     default: 
      return false; 
     } 
} 
+12

間違っています - どこでもメソッドisEditableはありませんb)TableColumnは編集可能性の概念が全くありませんc)TableCellは存在しません。正しさは、TableModelの実装では、_isCellEditable_またはsloppinessの場合には、JTable -1です。 – kleopatra

17

オーバーライドしている場合は、設定することができますか? JXTable/TableColumnExt SwingXプロジェクトの

public boolean isCellEditable(int rowIndex, int columnIndex){ 
return columnIndex == 0; //Or whatever column index you want to be editable 
} 
+0

'rowIndex == 0 'でない' columnIndex == 0'です。 –

+0

ああ、もちろん、愚かなタイプミスです。一定。 – EricR

5

は、モデルによって返されたものと比較して編集可能性を狭めるためにのみ可能であることをテーブルごとおよび列

// make the table completely read-only 
xTable.setEditable(false); 
// make a column read-only 
xTable.getColumnExt(index).setEditable(false); 

注編集可能性を設定するためのAPIを持っています。 isCellEditable。つまり、編集可能なセルを読み取り専用にすることはできますが、それ以外の方法では行うことはできません。

-1

Kleopatraの発言を読んでください。彼はjavax.swing.JXTableを見たことがありました。最初に見て:))私はあなたがリンクに従うことをお勧めします

私はasnwerを検索し、私自身の解決策にいくつかの答えを組み合わせました:(ただし、すべての解決策は安全ではありませんが、

編集可能かどうかを設定する柔軟性を保つことができます。私はこの例を例として使用しました:

columnsEditable=new ArrayList<Integer>(); 
    table=new JTable(new DefaultTableModel(){ 

      @Override 
      public boolean isCellEditable(int row, int col) { 
       if(columnsEditable.isEmpty()){ 
        return false; 
       } 
       if(columnsEditable.contains(new Integer(col))){ 
        return true; 
       } 
       return false; 
      } 
    }); 

そして私は編集可能かどうかを設定するために、この関数を使用:

public void setColumnEditable(int columnIndex,boolean editable){ 
    if(editable){ 
     if(!columnsEditable.contains(new Integer(columnIndex))){ 
      columnsEditable.add(new Integer(columnIndex)); 
     } 
    }else{ 
     if(columnsEditable.contains(new Integer(columnIndex))){ 
      columnsEditable.remove(new Integer(columnIndex)); 
     } 
    } 
} 

注:もちろん、あなたがこのクラスのグローバルcolumnsEditableとJTableのテーブルを定義する必要があります。

private JTable table; 
private ArrayList<Integer> columnsEditable; 

注2 :デフォルトでは、すべての列は編集可能ではありませんが、それが私の望む動作です。 otherwhiseを呼び出す場合は、columnsEditableにすべての列を追加するか、動作を完全に変更します(代わりにArrayList columnsNonEditableを作成します)。 Kleopatraの発言に関しては、この最後の提案を使用しないほうが良いです(ただし、使用される表モデルと残りのプログラムで何をするかによって異なります)。

+0

安全な解決策ではありません:ビューはモデルの設定を尊重しなければならないので、ビューレベルで実装するものはモデルの編集可能性を絞り込むことができます。あなたのコードのどこかで、モデルを最初にクエリしなければならず、その結果がtrueを返す場合に限り、その決定を保持または変更してください。 – kleopatra

+0

このフィードバックはありがたいですが、簡単に実装できると思います。編集可能な列をハードコーディングするよりももっと柔軟になりたいと思っています。しかし、それは良いことだと思いますが、コロンはこれを変更しますが、私は通常次のように設定します:table.getTableHeader()。setReorderingAllowed(false)(例えば) –

+0

@kleopatra:あなたのコメントは、テーブルモデルとして使用します。デフォルトのテーブルモデルは常に編集可能ですので、編集可能性を設定すると、それを絞り込むだけで拡大することはありません。私のソリューションに加えて、他のソリューションの可能性を広げています。 –

10

これは、3列目と8列目に対して編集可能なtrueを設定し、それ以外の場合はfalseを設定します。

DefaultTableModel model = new DefaultTableModel() { 

      boolean[] canEdit = new boolean[]{ 
        false, false, true, false, false,false,false, true 
      }; 

      public boolean isCellEditable(int rowIndex, int columnIndex) { 
       return canEdit[columnIndex]; 
      } 
}; 
+0

Thx @arash、良いコードです。 (rowIndexに== 0 && columnIndexにあれば、私は少し** '上書き@ \t \t \t公共ブールisCellEditable(int型rowIndexに、int型columnIndexに){ \t \t \t \tは...次のコードを使用して、特定のセルを無効にするように変更されています== 1){偽 \t \t \tリターン;} \t \t \t \t戻りcanEdit [columnIndexに]。 } '** ...これは、特定のセルを無効にする場合に便利です。 –

関連する問題