【问题标题】:Disable user edit in JTable [duplicate]在 JTable 中禁用用户编辑 [重复]
【发布时间】:2012-04-12 17:41:21
【问题描述】:

创建 JTable 组件时,默认启用单元格编辑。如何防止用户编辑 JTable 的内容?

【问题讨论】:

标签: java swing jtable edit


【解决方案1】:
        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);

在此方法“isCellEditable”中,我们可以启用和禁用特定列的用户编辑。在这种情况下,启用 column=11 并禁用该列的其余部分

【讨论】:

  • edit 解释为什么这段代码回答了这个问题。
【解决方案2】:

我知道我迟到了,但希望有人能利用它。您可以像这样简单地添加鼠标侦听器:

jtable.addMouseListener( new MouseAdapter () {
    @Override
    public void mouseClicked ( MouseEvent e ) {
        columnIndex = replacedAssets.getSelectedColumn ();
        System.out.println ( "Double click on jtable" );
        if ( columnIndex == 1 || columnIndex == 2 ) {
            JOptionPane.showMessageDialog ( parent , "Editing this Field may cause error in the data." , "Error Edit Not Permitted For This Field" , JOptionPane.ERROR_MESSAGE );
        }
    }
});

此代码阻止编辑索引 1 和 2 的列,您可以删除 if 条件以使其适用于所有列。

【讨论】:

    【解决方案3】:

    在 netbeans 上,您可以右键单击表格并单击表格内容,然后转到列选项卡并取消选中“可编辑”复选框。问候!!

    【讨论】:

      【解决方案4】:

      你试过简单吗:

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

      关于JComponent.setEnabled(boolean)它说:

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

      当谈到 JTable 时,它​​似乎根本没有提供任何视觉反馈。仍然可以单击列标题的好处。在我的实现中,应用程序仍然可以更改单元格的内容。

      【讨论】:

      • 糟糕。刚刚看到用户 Siddhu 在这里提供了相同的解决方案:stackoverflow.com/questions/1990817/…。不知道我应该将它删除还是保留它,因为我不知道哪个问题可能会被删除为重复项。对不起,这里是菜鸟:o
      • 这个问题是用户无法看到是否有任何行或单元格被选中,即使他点击了它。我发现使用setDefaultEditor() 比这更好,因为它在用户选择任何行或单元格时提供视觉反馈。
      【解决方案5】:
      myTable.setDefaultEditor(Object.class, null);
      

      【讨论】:

      • 也许您可以解释一下这项工作并列举缺点?语义似乎与以前的答案不同——即你正在设置一个空编辑器。也许这比较慢,因为断言表格是否可编辑需要遵循更长的代码路径?
      • 这是我一直在寻找的简单答案。可能不是最好的性能,但它的简单性是值得的。
      • 很高兴知道这个解决方案是如何在幕后工作的。
      【解决方案6】:

      您可以使用以下代码创建 JTable:

          JTable jTable = new JTable() {
              private static final long serialVersionUID = 1L;
      
              public boolean isCellEditable(int row, int column) {                
                      return false;               
              };
          };
      

      基本上我们在这里所做的是覆盖isCellEditable 并始终从中返回false。这将制作一个不可编辑的 JTabel。

      【讨论】:

      • 如果这一切都是你做的,我认为使用匿名类没有问题。
      • 这应该是更好的答案。我在这里使用匿名类没有发现任何问题。另外,用户可能会在其他位置使用不同的TableModel。点赞!
      • +1 @instict 因为这不会影响表格模型,在我看来这是一个更好的答案。还有一个问题:serialVersionUID 真的有必要吗?
      【解决方案7】:

      嗨,我在 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);
      

      享受这对我来说效果很好。我想做的就是帮助你们,因为我很早就得到了帮助。

      【讨论】:

      • 这些都是一样的。第二个代码 sn-p 只包含较少不相关的代码,这使它更好地作为答案。
      • @MicahStairs 在执行过程中第一个更好,因为该类将很容易编译,而第二个是需要更多时间的覆盖,但是从开发人员的设计视图其次是更易于维护的代码;
      【解决方案8】:

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

      【讨论】:

      • 我正在尝试此代码以避免用户能够编辑单元格的内容,这正在查找。但是,它也避免了应用程序更改单元格的内容,是否有针对该特定场景的解决方法?
      猜你喜欢
      • 1970-01-01
      • 2017-08-10
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 2016-01-18
      • 2014-12-17
      • 2013-07-12
      • 1970-01-01
      相关资源
      最近更新 更多