如何使jtable在java中不可编辑?

我创建了一个将数据加载到JTable的函数。 一切正常,但该表中的所有单元格都是可编辑的。 顺便说一句,我使用defaultTableModel作为表模型。 我在Netbeans IDE中这样做。 请帮忙。 这是我的代码:

 private void updateTable(String searchText){ if(searchText != null) this._sqlCmd = this._sqlCmd + " WHERE "+columnCombo.getSelectedItem()+" LIKE '%"+searchText+"%'"; jTable1.setSurrendersFocusOnKeystroke(true); table = (javax.swing.table.DefaultTableModel) jTable1.getModel(); try{ table.setRowCount(0); }catch(Exception e){} try { ResultSet rs = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY).executeQuery(_sqlCmd); while (rs.next()){ Object[] data = new Object[numOfCols]; for(int i=0; i<data.length; i++){ data[i] = rs.getObject(i+1); } table.addRow(data); } table.fireTableDataChanged(); } catch (SQLException ex) { Logger.getLogger(FindContactGrid.class.getName()).log(Level.SEVERE, null, ex); } } 

  private TableModel model = new DefaultTableModel(data, columnNames) { public boolean isCellEditable(int row, int column) { return false;//This causes all cells to be not editable } }; private JTable table = new JTable(model); 

编辑。 如果您在Netbeans IDE设计器中执行此操作,请按照以下步骤操作:

  • 选择放置JTable的表单
  • 在导航窗格中,展开JScrollPane并右键单击JTable并选择Customize Code ,如下所示:

导航窗格

  • 在代码自定义程序中,选择第二个下拉列表并选择自定义属性 。 这使您可以编辑DefaultTableModel代码定义。
  • 现在粘贴这个: {public boolean isCellEditable(int row, int column){return false;}}在最后一个关闭blacket之前);

您的最终设置应如下所示:

  • 按确定保存 – 并完成工作。

代码定制器

如果使用DefaultTableModel,则可以覆盖方法isCellEditable并在构造GUI时实现它:

 table.setModel(new DefaultTableModel() { @Override public boolean isCellEditable(int row, int column) { return false; } }); 

使用Netbeans可以采用另一种方式。 如果你想继续使用默认的表模型,因为OP提到如果你不想创建一个新的表模型。

  1. 选择JTable“属性”

  2. 在“属性”中选择“TableModel”字段,这将打开另一个DialogBox。

  3. 从那里可以修改每列的“可编辑”复选框字段。

不确定从哪个版本开始,但我使用的是Netbeans 7.2

正如其他人所说,你必须创建自己的DefaultTableModel并覆盖isCellEditable 。 为了在Netbeans设计器中使用它:

  • 右键单击您的表格
  • 属性 – >代码
  • Custom Creation Code中添加: new JTable(new MyModel()) (假设您创建类MyModel扩展AbstractTableModel)

尝试这个

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