如何在Java中使JTable不可编辑?

11

我创建了一个函数,将数据加载到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);
    } 
}

这是更新数据模型的代码。可编辑单元格与JTable有关。 - maple_shaft
我强烈建议避免空的catch块,特别是在catch中捕获任何可能的“Exception”时。 - Robin
可能是重复的问题:如何使JTable不可编辑 - Math
6个回答

34
 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,选择下面所示的 自定义代码

导航窗格

  • 在代码自定义器上,选择第二个下拉菜单并选择 自定义属性。这使您可以编辑 DefaultTableModel 代码定义。
  • 现在在最后一个闭合括号);之前粘贴此文本:{public boolean isCellEditable(int row, int column){return false;}}

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

  • 按“确定”保存 - 工作完成。

代码自定义器


谢谢,但我不认为这会在我的代码中起作用。我正在使用的默认表格模型是由NetBeans创建的。不幸的是,我无法编辑代码。还有其他方法吗? - John
你可以在Netbeans中完成这个操作。@alain.janinm已经发布了如何在Netbean设计师中完成此操作的方法。 - Bitmap
@user1349213,请查看我在如何在Netbeans中完成此操作的答案的编辑版本。 - Bitmap

9

如果您使用DefaultTableModel,您可以通过覆盖方法isCellEditable并在构建GUI时实现它:

table.setModel(new DefaultTableModel() {

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

2

试一试

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

1
添加一些细节。 - Chetan Joshi

2

还有另一种使用Netbeans的方法。如果您想继续使用默认表格模型,就像OP所提到的那样,如果您不想创建新的表格模型,也是可以的。

  1. 选择JTable“属性”

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

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

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


能否解释一下你的负评?这个解决方案是有效的。 - user2485933

1

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

  • 右键单击表格
  • 属性 -> 代码
  • 自定义创建代码中添加此代码:new JTable(new MyModel())(假设您创建的类是MyModel,继承自AbstractTableModel)

-1
JTextField f = new JTextField();
f.setEditable(false);
for (int i = 0; i < table.getColumnModel().getColumnCount(); i++) {
    table.getColumnModel().getColumn(i).setCellEditor(new DefaultCellEditor(f));
}

虽然这样可能可行,但这不是实现此目的的方法。已经接受的答案提供了正确的方法。 - Laf
这是另一种禁用jtable的方法,它非常完美。 - عبد القادر كعوان

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