2012-03-29 64 views
23

Khi tạo thành phần JTable, tính năng chỉnh sửa ô được bật theo mặc định. Làm cách nào để ngăn người dùng chỉnh sửa nội dung của JTable?Tắt chỉnh sửa người dùng trong JTable

+2

Xem [* Cách sử dụng bảng *] (http://docs.oracle.com/javase/tutorial/uiswing/components/table.html). – trashgod

Trả lời

33

JTable sử dụng đối tượng AbstractTableModel. Đây là thứ bạn truyền vào hàm tạo của JTable. Bạn có thể viết AbstractTableModel của bạn như sau

public class MyTableModel extends AbstractTableModel { 

     public boolean isCellEditable(int row, int column){ 
      return false; 
     } 

} 

và sau đó khởi tạo JTable của bạn như

JTable myTable = new JTable(new MyTableModel()); 
+0

Tôi đã thử mã này để tránh người dùng có thể chỉnh sửa nội dung của một ô đang hoạt động. Tuy nhiên, nó cũng tránh ứng dụng thay đổi nội dung của ô, có cách giải quyết nào cho trường hợp cụ thể đó không? – clement

+3

Rõ ràng, chỉ đơn giản là đi qua một boolean không phải là sang trọng đủ cho các nhà thiết kế ... – pauluss86

39

Bạn có thể tạo một JTable sử dụng đoạn mã sau:

JTable jTable = new JTable() { 
     private static final long serialVersionUID = 1L; 

     public boolean isCellEditable(int row, int column) {     
       return false;    
     }; 
    }; 

Về cơ bản những gì chúng ta đang làm ở đây là trọng isCellEditable và luôn luôn trả về false từ nó. Điều này sẽ tạo ra một JTabel không chỉnh sửa.

+0

Nếu đây là tất cả những gì bạn đang làm, tôi không thấy vấn đề với việc sử dụng một lớp ẩn danh. – Chase

+3

điều này sẽ là câu trả lời tốt hơn. Tôi không tìm thấy bất cứ điều gì sai trong việc sử dụng lớp học anon ở đây. Người dùng có thể sử dụng 'TableModel' khác ở vị trí khác. Upvote! – instinct

+2

+1 @instict vì điều này không ảnh hưởng đến mô hình bảng này là một câu trả lời tốt hơn nhiều theo ý kiến ​​của tôi. Ngoài ra câu hỏi: là serialVersionUID thực sự cần thiết? – Paul

4

Hi Tôi đang làm việc rất nhiều trên java vì vậy tôi sẽ cung cấp cho bạn cách của tôi: Có hai khả năng đầu tiên dưới netbeans. Chuyển đến mã tùy chỉnh và làm cho nó như thế này:

JTArticleJPAddArrticle = new javax.swing.JTable(); 

JTArticleJPAddArrticle.setBackground(new java.awt.Color(204, 204, 255)); 

JTArticleJPAddArrticle.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] { 

}, 
new String [] { 
    "Reference","Libellé","Marque","Prix d'achat","Prix de vente","Quantité","Total","Etat" 
} 
){ 
public boolean isCellEditable(int rowIndex, int columnIndex) { 
    return false; 
} 
}); 



jScrollPane8.setViewportView(JTArticleJPAddArrticle); 

Cách khác của tôi là làm ví dụ cho mô hình bảng. Đây là cách thứ hai:

model=new DefaultTableModel(head, 0){ 

    @Override 
    public boolean isCellEditable(int i, int i1) { 
     return false; //To change body of generated methods, choose Tools | Templates. 
    } 

    }; 
jtable.setmodel(model); 

Hãy tận hưởng điều này phù hợp với tôi. Tất cả những gì tôi muốn làm là giúp đỡ các bạn bởi vì tôi đã được giúp đỡ rất nhiều trước đó.

+0

Đây là cả hai cùng một cách.Đoạn mã thứ hai chỉ chứa ít mã không liên quan hơn, làm cho mã này trở nên tốt hơn như một câu trả lời. –

+0

@MicahStairs trong quá trình thực thi đầu tiên tốt hơn vì lớp sẽ được biên dịch dễ dàng so với bước thứ hai là ghi đè sẽ mất thêm một chút thời gian, nhưng theo quan điểm thiết kế cho nhà phát triển, thứ hai là mã dễ bảo trì tốt hơn; –

10
myTable.setDefaultEditor(Object.class, null); 
+2

Có lẽ bạn có thể giải thích công việc này và liệt kê những hạn chế? Có vẻ như ngữ nghĩa khác với các câu trả lời trước - tức là. bạn đang thiết lập một trình soạn thảo rỗng. Có lẽ điều này là chậm hơn bởi vì khẳng định liệu bảng có thể chỉnh sửa được yêu cầu sau một đường dẫn mã dài hơn không? –

+1

Đây là câu trả lời đơn giản mà tôi đang tìm kiếm. Có thể không phải là hiệu suất tốt nhất khôn ngoan, nhưng đơn giản của nó là giá trị nó. – Cristian

2

Bạn đã tryed đơn giản:

JTable table = new JTable(); 
table.setEnabled(false); 

Về JComponent.setEnabled(boolean) nó Sayes:

Sets hay không phần này được kích hoạt. Một thành phần được kích hoạt có thể đáp ứng đầu vào của người dùng, trong khi một thành phần không được kích hoạt không thể trả lời đầu vào của người dùng. Một số thành phần có thể thay đổi biểu diễn trực quan của chúng khi chúng bị vô hiệu hóa để cung cấp phản hồi cho người dùng rằng chúng không thể lấy đầu vào.

Khi nói đến JTable, dường như không có bất kỳ phản hồi trực quan nào cả. Với các perk vẫn có thể bấm vào các tiêu đề cột. Và trong quá trình thực hiện của tôi, ứng dụng vẫn có thể thay đổi nội dung của các ô.

+0

Rất tiếc. Chỉ cần thấy rằng người dùng Siddhu đến với cùng một giải pháp ở đây: http://stackoverflow.com/questions/1990817/how-to-make-a-jtable-non-editable?noredirect=1&lq=1. dunno nếu tôi nên loại bỏ nó ở đây hoặc rời khỏi nó, vì tôi không biết câu hỏi có thể bị xóa như là một bản sao. Xin lỗi, một noob ở đây: o – brat

+0

Vấn đề với điều này là người dùng không thể thấy nếu bất kỳ hàng hoặc ô nào được chọn ngay cả sau khi anh ta nhấp vào nó. tôi tìm thấy bằng cách sử dụng 'setDefaultEditor()' để tốt hơn điều này vì nó cung cấp một phản hồi trực quan khi người dùng chọn bất kỳ hàng hoặc ô nào. – anotherGatsby

0
 tm = new javax.swing.table.DefaultTableModel() 
       { 
         public Class<?> getColumnClass(int column) 
         { 
         switch(column) 
         { 
         case 0: 
          return String.class; 
         case 1: 
          return String.class; 
         case 2: 
          return String.class; 
         case 3: 
          return String.class; 
         case 4: 
          return String.class; 
         case 5: 
           return String.class; 
          case 6: 
           return String.class; 
          case 7: 
           return String.class; 
          case 8: 
           return String.class; 
          case 9: 
            return String.class; 
           case 10: 
            return String.class; 
           case 11: 
            return Boolean.class; 

          default: 
          return String.class; 
         } 
         } 

         @Override 
         public boolean isCellEditable(int row, int column) { 
         /* Set the 11th column as editable and rest non- 
           editable */ 
          if(column==11){ 
           return true; 
          }else{ 
//all other columns to false 
         return false; 
          } 
         } 
        }; 
    table = new javax.swing.JTable(tm); 
+0

Vui lòng [edit] (https://stackoverflow.com/posts/49110309/edit) câu trả lời của bạn để giải thích tại sao đoạn mã này trả lời câu hỏi. –

Các vấn đề liên quan