使JTable的单元格不可编辑

3
我正在尝试在用户双击单元格时使JTable的所有单元格都不可编辑。我已经阅读了许多论坛帖子,一般共识是创建一个新的表格模型类,扩展DefaultTableModel并覆盖isCellEditable(int row, int column)方法。我做到了所有这些,但现在当我运行我的程序(applet)时,单元格中什么也没有显示。注意,我这学期有一位教授认为applets还没有过时...

表格模型的代码:

public class MyTableModel extends DefaultTableModel
{
    public boolean isCellEditable(int row, int column)      //override isCellEditable
    //PRE:  row > 0, column > 0
    //POST: FCTVAL == false always
    {
        return false;
    }
}

    Code in my class:  **NOTE** this class extends JPanel 

    private JScrollPane storesPane;                
    private JTable storesTable; 

    Code in the Constructor:             

    storesTable = new JTable(tableData, COL_NAMES);    //tableData and COL_NAMES are passed in
    storesTable.setModel(new MyTableModel());

    storesPane = new JScrollPane(storesTable);
    storesTable.setFillsViewportHeight(true);
    add(storesPane, BorderLayout.CENTER);     

希望一些Java专家能够找出我的错误 :)

可能是重复的问题:Java JTable - Make only one column editable - Line
4个回答

6

这行代码创建了一个新的JTable,并在幕后隐式创建了一个DefaultTableModel,它持有JTable所需的所有正确数据:

storesTable = new JTable(tableData, COL_NAMES);

这行代码有效地移除了上面隐式创建的表格模型,该模型保存了表格的所有数据,并用一个完全不包含数据的表格模型进行替换:

storesTable.setModel(new MyTableModel());

您需要为MyTableModel类添加一个构造函数,在该构造函数中调用super构造函数,并将当前在表格构造函数中传递的数据传递给它。

例如,

public class MyTableModel extends DefaultTableModel {

   public MyTableModel(Object[][] tableData, Object[] colNames) {
      super(tableData, colNames);
   }

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

然后你可以像这样使用它:
MyTableModel model = new MyTableModel(tableData, COL_NAMES);
storesTable = new JTable(model);

1
嘿,这个很棒。我从来没有使用过Table Models或者Swing GUI中的任何东西。 - codeMasterFiveThousand

3

只需覆盖DefaultTableModel类的isCellEditable方法即可。快速完成此操作的方法如下:

JTable table = new JTable();
DefaultTableModel dtm = new DefaultTableModel(0, 0) {
    public boolean isCellEditable(int row, int column) {
        return false;
    }
};
table.setModel(dtm);

3

今天早些时候我也遇到了同样的问题。以下解决方法适用于我。

    JTable table = new JTable( data, headers ){  
      public boolean isCellEditable(int row, int column){  
        return false;  
      }  
    };  

运行很好!

1

你好,朋友。我也在处理表格相关的工作,请试试我的代码。

    import javax.swing.table.AbstractTableModel;

    public class Table extends AbstractTableModel {

    private boolean DEBUG = false;
    private String[] columnNames = {"                Date Time", "                Parameter",
    "   Barometric Pressure (hPa)", "           Temperature (°C)", "             Battery             Voltage    (V)"};

public static Object[][] data = {};


public TableControllerViewdataTabTableModel() {
}

@Override
public int getColumnCount() {
    return columnNames.length;
}

@Override
public int getRowCount() {
    return data.length;
}

@Override
public String getColumnName(int col) {
    return columnNames[col];
}

@Override
public Object getValueAt(int row, int col) {
    return data[row][col];
}

@Override
public Class getColumnClass(int c) {
    return getValueAt(0, c).getClass();
}

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

}

@Override
/**
 * The setValueAt.
 */
public void setValueAt(Object value, int row, int col) {
    data[row][col] = value;
    fireTableCellUpdated(row, col);

    if (DEBUG) {

        printDebugData();
    }
}

/**
 * The printDebugData.
 */
private void printDebugData() {
    int numRows = getRowCount();
    int numCols = getColumnCount();

    for (int i = 0; i < numRows; i++) {

        for (int j = 0; j < numCols; j++) {
        }

    }

}
}

请在您的表格类中重写此方法:@Override public boolean isCellEditable(int row, int col) { return false; } - Sandeep

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