禁用JTable中的用户编辑功能

36

当创建JTable组件时,默认情况下启用单元格编辑。我应该如何防止用户编辑JTable的内容?


3
请查看如何使用表格 - trashgod
1
这个回答解决了你的问题吗?如何使JTable不可编辑 - Peter Alsen
8个回答

55

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

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

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

我们在这里的基本做法是重写isCellEditable方法,并始终从中返回false。 这将使JTabel不可编辑。


如果这是你所做的一切,我认为使用匿名类没有问题。 - Chase
4
这应该是更好的答案。我认为在这里使用匿名类没有任何问题,并且用户可能在其他位置使用不同的"TableModel"。点赞! - instinct
2
+1 @instict 因为这不会影响表格模型,我个人认为这是一个更好的答案。另外,问题是:serialVersionUID 真的必要吗? - Paul

50

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

1
我正在尝试使用这段代码来防止用户编辑单元格的内容,这个功能已经正常工作了。 然而,它也阻止了应用程序更改单元格的内容,针对这种特定情况有什么解决方法吗? - clement

31
myTable.setDefaultEditor(Object.class, null);

2
也许您可以解释一下这是如何工作的,并列举一些缺点?它似乎与之前的答案语义不同——即,您正在设置一个空编辑器。也许这会更慢,因为断言表格是否可编辑需要遵循更长的代码路径? - Jonas G. Drange
4
这是我所寻找的简单答案。尽管可能不是性能最佳的选择,但它的简洁易懂非常值得。 - Cristian
1
知道这个解决方案在幕后是如何工作的会很好。 - rchrd

14

你尝试过简单地:

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

关于JComponent.setEnabled(boolean),它的说明如下:

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

但是对于 JTable 组件似乎没有任何视觉反馈。尽管如此,您仍然可以点击列标题,并且在我的实现中,应用程序仍然可以更改单元格的内容。


问题在于用户无法看到是否选择了任何行或单元格,即使他点击了它。我发现使用 setDefaultEditor() 比这更好,因为它在用户选择任何行或单元格时提供了视觉反馈。 - anotherGatsby

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

我非常喜欢这东西,它对我来说很好用。我想做的就是帮助你们,因为我之前得到了很多帮助。


这两种方式是相同的。第二段代码片段只包含较少的无关代码,这使它更适合作为答案。 - Micah Stairs
在执行过程中,第一个更好,因为类将更容易编译,而第二个是一个覆盖,需要更多时间。但从开发人员的设计角度来看,第二个更好,易于维护的代码。 - Mohammed Housseyn Taleb

1
在Netbeans中,您可以右键单击表格,然后单击“表格内容”,接着进入“列”选项卡并取消选中“可编辑”复选框。问候!

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

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

请编辑您的答案,解释为什么这段代码可以回答问题。 - André Kool

0

我知道我来晚了,但希望有人能够使用这个。您可以像这样简单地添加鼠标监听器:

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条件使其适用于所有列。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接