2012-03-29 66 views
23

创建JTable组件时,默认情况下启用单元编辑。如何防止用户编辑JTable的内容?在JTable中禁用用户编辑

+2

请参阅[*如何使用表*](http://docs.oracle.com/javase/tutorial/uiswing/components/table.html)。 – trashgod 2012-03-29 05:06:38

回答

33

JTable使用AbstractTableModel对象。这是你传递给JTable构造函数的东西。您可以编写自己的AbstractTableModel上如下

public class MyTableModel extends AbstractTableModel { 

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

} 

然后初始化你的JTable作为

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

我正在尝试此代码,以避免用户能够编辑单元格的内容,这是工作查找。 但是,它也可以避免应用程序更改单元格的内容,是否有任何解决方法适用于特定场景? – clement 2013-10-09 04:41:05

+3

显然,仅仅传递一个布尔值对于设计者来说不够优雅...... – pauluss86 2014-01-17 16:47:48

39

您可以创建一个JTable使用下面的代码:

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

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

基本上我们这里做的是压倒一切的isCellEditable始终返回从中假的。这将会产生一个不可编辑的JTabel。

+0

如果这是你所做的一切,我没有看到使用匿名类的问题。 – Chase 2013-09-23 16:33:54

+3

这应该是更好的答案。我在这里使用匿名课没有发现任何错误。 Plus用户可能在其他位置使用不同的'TableModel'。给予好评! – instinct 2015-05-27 09:15:12

+2

+1 @instict因为这不影响表模型,在我看来这是一个更好的答案。还有问题:serialVersionUID真的有必要吗? – Paul 2015-06-01 04:20:55

4

嗨,我是java的工作很多,所以我会给你我的方式: 有第一个NetBeans下的两种可能性。去定制代码,并使其如下:

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

我的另一种方法是做一个表模型的实例。这是第二种方式:

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

享受这对我来说很好。我所要做的就是帮助你们,因为我得到了很多帮助。

+0

这些都是相同的方式。第二个代码片段只包含较少不相关的代码,这使得它更好地作为答案。 – 2016-10-17 00:12:54

+0

@MicahStairs在执行过程中第一个更好,因为该类将很容易编译,而第二个是需要更多时间的重写,但通过开发人员的设计视图,第二个是更易于维护的代码; – 2017-03-25 09:49:19

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

也许你可以解释这个作品并列举缺点?它的语义似乎不同于以前的答案 - 即。你正在设置一个空编辑器。也许这比较慢,因为断言表是否可编辑需要更长的代码路径? – 2016-05-01 20:11:57

+1

这是我正在寻找的简单答案。可能不是最好的表现,但它的简单性是值得的。 – Cristian 2018-03-04 15:01:50

2

你有没有简单tryed:

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

关于JComponent.setEnabled(boolean)它sayes:

设置组件是否被启用。启用的组件可能会响应用户输入,而未启用的组件无法响应用户输入。某些组件在禁用时可能会改变其视觉表示,以便向用户提供他们无法输入的反馈。

当涉及到JTable它似乎没有给任何视觉反馈。随着仍然能够点击列标题的振作。在我的实现中,应用程序仍然可以更改单元格的内容。

+0

糟糕。刚刚看到用户Siddhu在这里提供了相同的解决方案:http://stackoverflow.com/questions/1990817/how-to-make-a-jtable-non-editable?noredirect=1&lq=1。不知道如果我应该在这里删除它或离开它,因为我不知道哪个问题可能被删除为重复。对不起,这里有个小菜一碟:o – brat 2017-05-20 02:04:09

+0

问题在于,用户无法看到是否有任何行或单元格被选中,即使他点击了它。我发现使用'setDefaultEditor()'比这更好,因为当用户选择任何行或单元格时,它提供了一个视觉反馈。 – anotherGatsby 2017-12-07 18:45:00

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

请[编辑](https://stackoverflow.com/posts/49110309/edit)你的答案解释为什么这段代码回答这个问题。 – 2018-03-05 12:33:26