2011-11-17 66 views
14

我想知道如何使一列的JTable可編輯,其他列必須是不可編輯的。Java JTable - 只能編輯一列

我已覆蓋isCellEditable(),但這會將每個單元更改爲不可編輯。 Thnx提前。

回答

29

如果是isEditableTableColumnTableColumn and TableCell

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

錯誤 - a)沒有方法可以在任何地方編輯b)TableColumn根本沒有可編輯性的概念c)TableCell不存在。正確的是_isCellEditable_或者在TableModel實現上或者在JTable上 - 對於sloppiness來說是-1 – kleopatra

17

覆蓋的table model

isCellEditable(int rowIndex, int columnIndex)有兩個參數,只爲你想要的列返回true,你可以設置?

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

它是'columnIndex == 0'而不是'rowIndex == 0' –

+0

啊,當然是愚蠢的錯字。固定。 – EricR

5

的SwingX項目JXTable/TableColumnExt有API來配置可編輯每個表和每列

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

請注意,這是唯一可能的相比,通過模型返回到縮小的可編輯性。的isCellEditable。這是你可以使一個可編輯的單元格只讀,但不是相反方向

-1

讀Kleopatra的評論(他第二次他建議看看javax.swing.JXTable,現在我很抱歉,我沒有看起來第一次:))我建議你按照鏈接

我搜索了一個asnwer,並結合了幾個答案給我自己的解決方案:(然而,並不安全的所有解決方案,但可以理解和快速推動,雖然我recommende看上面的鏈接)

你可以留着它更靈活的設置哪一列可編輯與否後來,我用這個爲〔實施例:

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 :默認情況下,所有列都不可編輯,但這是我期望的行爲。如果你想知道其他方面,可以將所有列添加到columnsEditable或完全更改行爲(使ArrayList columnsNonEditable取而代之)。 關於Kleopatra的評論:最好不要使用這最後的建議(但它取決於使用的表模型和你在你的程序的其餘部分做什麼)。

+0

不是一個安全的解決方案:視圖_必須尊重模型的設置,所以無論你在視圖級別實現什麼,都只能縮小模型的可修改性,而不能擴大它。因此,在你的代碼的某個地方,你必須首先查詢模式,只有當返回true,保持或改變這一決定 – kleopatra

+0

好,對於反饋意見的感謝,但可以很容易地實現,我認爲。我想要的是比編碼可編輯的列更硬編碼。但它是一個很好的事情考慮,改變colmns將改變這一點,但是我通常設置:table.getTableHeader()setReorderingAllowed(假)(例如) –

+0

@kleopatra:思考過它,您的評論也取決於你用作表格模型。默認的TableModel始終是可編輯的,所以設置editabilty只會縮小它,從來沒有擴大。除了我的解決方案僅僅消耗其他解決方案的可能性。 –

10

對於第3列和第8列,這將設置爲可編輯的,對其他列爲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,很好的一段代碼。我稍微修改以禁用特定細胞,用下面的代碼... **'@覆蓋 \t \t \t公共布爾的isCellEditable(INT的rowIndex,INT columnIndex){ \t \t \t \t如果(rowIndex位置== 0 && columnIndex == 1){ \t \t \t返回FALSE;} \t \t \t \t返回canEdit [columnIndex]; }「** ......可這有用的禁用特定的細胞。 –