2011-11-17 10 views
14

Tôi đã tự hỏi làm thế nào để làm cho một cột của một JTable có thể chỉnh sửa được, các cột khác không thể chỉnh sửa được.Java JTable - Chỉ tạo một cột có thể chỉnh sửa

Tôi đã ghi đè isCellEditable() nhưng điều này sẽ thay đổi mọi ô thành không thể chỉnh sửa. Thnx trước.

Trả lời

29

bạn có thể thiết lập nếu là isEditable cho TableColumn hoặc TableColumn and TableCell quá

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

sai - a) không có phương pháp nào có thể chỉnh sửa ở bất kỳ đâu b) TableColumn không có khái niệm về khả năng chỉnh sửa ở tất cả c) TableCell không tồn tại. Chính xác sẽ là _isCellEditable_ hoặc trên thực hiện TableModel hoặc trên JTable - -1 cho sloppiness – kleopatra

17

Override các table model

isCellEditable(int rowIndex, int columnIndex) nhận hai đối số, chỉ trả đúng đối với các cột bạn muốn?

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

Đó là 'columnIndex == 0' không' rowIndex == 0' –

+0

Ah, tất nhiên, lỗi đánh máy. Đã sửa. – EricR

5

JXTable/TableColumnExt của dự án SwingX có api để cấu hình editability mỗi bảng và mỗi cột

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

Lưu ý rằng nó chỉ có thể thu hẹp editability so với được trả về bởi mô hình. isCellEditable. Đó là bạn có thể tạo một ô có thể chỉnh sửa chỉ đọc nhưng không theo cách khác tròn

-1

Đọc nhận xét của Kleopatra (lần thứ 2 anh đề nghị xem javax.swing.JXTable và giờ tôi xin lỗi tôi không có lần đầu tiên :)) Tôi khuyên bạn nên theo liên kết

Tôi đã tìm kiếm một asnwer và tôi kết hợp một số câu trả lời cho giải pháp của riêng mình: (tuy nhiên, không an toàn cho tất cả các giải pháp, nhưng dễ hiểu và nhanh chóng) khuyên bạn nên xem liên kết ở trên)

Bạn có thể giữ cho nó linh hoạt hơn để đặt cột nào có thể chỉnh sửa được hay không sau này, tôi đã sử dụng điều này cho exmaple:

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; 
      } 
    }); 

Và tôi đã sử dụng chức năng này để thiết lập có thể chỉnh sửa hay không:

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)); 
     } 
    } 
} 

Lưu ý: tất nhiên bạn phải xác định columnsEditable và JTable bảng toàn cầu trong lớp này:

private JTable table; 
private ArrayList<Integer> columnsEditable; 

Note 2 : theo mặc định tất cả các cột không thể chỉnh sửa được, nhưng đó là hành vi mong muốn của tôi. Nếu bạn whish otherwhise, hoặc thêm tất cả các cột vào cộtEditable hoặc thay đổi hành vi hoàn toàn (làm cho ArrayList cộtNonEditable thay). Về nhận xét của Kleopatra: tốt hơn là không sử dụng đề xuất cuối cùng này (nhưng nó phụ thuộc vào bảng mô hình được sử dụng và những gì bạn làm trong phần còn lại của chương trình).

+0

không phải là giải pháp an toàn: chế độ xem _must_ tôn trọng cài đặt của mô hình, vì vậy bất cứ điều gì bạn triển khai ở cấp chế độ xem chỉ có thể thu hẹp chỉnh sửa của mô hình, không bao giờ mở rộng nó.Vì vậy, một nơi nào đó trong mã của bạn, trước tiên bạn phải truy vấn mô hình và chỉ khi điều đó trả về đúng, hãy giữ hoặc thay đổi quyết định đó – kleopatra

+0

Ok, cảm ơn phản hồi đó, nhưng điều đó có thể được triển khai dễ dàng. Đó là nhiều hơn tôi muốn flexibilty hơn hardcoding cột đó là có thể chỉnh sửa. Nhưng đó là một điều tốt để suy nghĩ, thay đổi các colmns sẽ thay đổi điều này, tuy nhiên tôi thường đặt: table.getTableHeader(). SetReorderingAllowed (false) (ví dụ) –

+0

@ kleopatra: suy nghĩ về nó, bình luận của bạn cũng phụ thuộc vào những gì bạn sử dụng như một tablemodel. Bảng mô hình mặc định luôn có thể chỉnh sửa được, do đó, việc thiết lập chỉnh sửa sẽ chỉ thu hẹp nó, không bao giờ mở rộng. Bên cạnh đó giải pháp của tôi chỉ mở rộng khả năng của các giải pháp khác. –

10

điều này sẽ đặt có thể chỉnh sửa đúng cho cột 3 và 8 và sai cho những người khác.

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, đoạn mã tốt. Tôi đã chút thay đổi để vô hiệu hóa các tế bào đặc biệt, sử dụng đoạn mã sau ... ** '@ Override \t \t \t public boolean isCellEditable (int rowIndex, int columnIndex) { \t \t \t \t if (rowIndex == 0 && columnIndex == 1) { \t \t \t trả về false;} \t \t \t \t return canEdit [columnIndex]; } '** ... có thể hữu ích khi vô hiệu hóa một ô cụ thể. –