Java 如何使用复选框将表格单元格从可编辑更改为不可编辑

Java 如何使用复选框将表格单元格从可编辑更改为不可编辑,java,swing,netbeans,jtable,Java,Swing,Netbeans,Jtable,我在UI上创建了一个jTable,我想根据其他单元格的布尔状态(复选框)将单元格属性从可编辑更改为不可编辑。我已经看了几个例子,但没有达到预期的效果,主要是因为我犯了一个错误,用NetBeans创建UI,从而创建了大量我甚至无法编辑的代码 我的桌子: 编辑:已修复,正在工作,代码如下。 生成表/模型的代码: jTable1.setModel(new MyTableModel()); 表模型和实现的逻辑: class MyTableModel extends AbstractTableMode

我在UI上创建了一个jTable,我想根据其他单元格的布尔状态(复选框)将单元格属性从可编辑更改为不可编辑。我已经看了几个例子,但没有达到预期的效果,主要是因为我犯了一个错误,用NetBeans创建UI,从而创建了大量我甚至无法编辑的代码

我的桌子:


编辑:已修复,正在工作,代码如下。

生成表/模型的代码:

jTable1.setModel(new MyTableModel());
表模型和实现的逻辑:

class MyTableModel extends AbstractTableModel {
    private String[] columnNames = {"Job Type",
                                    "Name",
                                    "avg Time",
                                    "Buffer",
                                    "Buffer Parts",
                                    "Color"};
    private Object[][] data = {
    {"1", "Station 1",
     new Integer(10), new Boolean(false), new Integer(0), Color.red},
    {"2", "Station 2",
     new Integer(10), new Boolean(false), new Integer(0), Color.blue},
    {"3", "Station 3",
     new Integer(10), new Boolean(false), new Integer(0), Color.green},
    {"4", "Station 4",
     new Integer(10), new Boolean(false), new Integer(0), Color.orange},
    {"5", "Station 5",
     new Integer(10), new Boolean(false), new Integer(0), Color.black}
    };

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

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

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

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

    /*
     * JTable uses this method to determine the default renderer/
     * editor for each cell.  If we didn't implement this method,
     * then the last column would contain text ("true"/"false"),
     * rather than a check box.
     */
    public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }

    /*
     * Don't need to implement this method unless your table's
     * editable.
     */
    @Override
    public boolean isCellEditable(int row, int col) {
        //Note that the data/cell address is constant,
        //no matter where the cell appears onscreen.
        if (col == 0) { return false; }
        else if (col == 4) { 
            /*if (getValueAt(row,(col-1)) == "false") { System.out.println("NAO PODES EDITAR BOI"); }
            else if (getValueAt(row,(col-1)) == "true") { System.out.println("Podes que eu deixo!"); } */
            boolean di = (Boolean) getValueAt(row,(col-1));
            if (!di) { return false; }
            else { return true; }
        }
        else { return true; }
    }

    /*
     * Don't need to implement this method unless your table's
     * data can change.
     */
    public void setValueAt(Object value, int row, int col) {
        data[row][col] = value;
        fireTableCellUpdated(row, col);
    }

    private void printDebugData() {
        int numRows = getRowCount();
        int numCols = getColumnCount();

        for (int i=0; i < numRows; i++) {
            System.out.print("    row " + i + ":");
            for (int j=0; j < numCols; j++) {
                System.out.print("  " + data[i][j]);
            }
            System.out.println();
        }
        System.out.println("--------------------------");
    }
}
类MyTableModel扩展了AbstractTableModel{ 私有字符串[]columnNames={“作业类型”, “姓名”, “平均时间”, “缓冲区”, “缓冲部件”, “颜色”}; 私有对象[][]数据={ {“1”,“1号站”, 新整数(10)、新布尔值(false)、新整数(0)、Color.red}, {“2”,“2号站”, 新整数(10)、新布尔值(false)、新整数(0)、Color.blue}, {“3”,“3号站”, 新整数(10)、新布尔值(false)、新整数(0)、Color.green}, {“4”,“4号站”, 新整数(10)、新布尔值(false)、新整数(0)、Color.orange}, {“5”,“5号站”, 新整数(10)、新布尔值(false)、新整数(0)、Color.black} }; public int getColumnCount(){ 返回columnNames.length; } public int getRowCount(){ 返回数据长度; } 公共字符串getColumnName(int-col){ 返回列名[col]; } 公共对象getValueAt(整数行,整数列){ 返回数据[行][col]; } /* *JTable使用此方法确定默认渲染器/ *每个单元格的编辑器。如果我们没有实现此方法, *最后一列将包含文本(“真”/“假”), *而不是复选框。 */ 公共类getColumnClass(int c){ 返回getValueAt(0,c).getClass(); } /* *不需要实现此方法,除非您的表 *可编辑。 */ @凌驾 公共布尔值可编辑(int行,int列){ //请注意,数据/单元地址是恒定的, //无论单元格出现在屏幕上的何处。 如果(col==0){return false;} 如果(col==4){ /*if(getValueAt(row,(col-1))=“false”){System.out.println(“NAO PODES EDITAR BOI”);} else if(getValueAt(row,(col-1))=“true”){System.out.println(“Podes que eu deixo!”);}*/ 布尔di=(布尔)getValueAt(行,(列-1)); 如果(!di){return false;} else{return true;} } else{return true;} } /* *不需要实现此方法,除非您的表 *数据可以改变。 */ public void setValueAt(对象值、整行、整列){ 数据[行][列]=值; FireTableCell更新(行、列); } 私有void printDebugData(){ int numRows=getRowCount(); int numCols=getColumnCount(); 对于(int i=0;i
在这种情况下,如果选中第3列的复选框(状态为true),则只允许编辑第4列上的单元格。希望有帮助

默认情况下,GUI编辑器会为您创建一个
DefaultTableModel
,但是您可以通过为相关属性指定
自定义代码来从生成的代码中撬开模型,如图所示。一旦控制了模型,就可以根据需要或如图所示重写
isCellEditable()


默认情况下,GUI编辑器会为您创建一个
DefaultTableModel
,但您可以通过为相关属性指定
自定义代码
从生成的代码中撬开模型,如图所示。一旦控制了模型,就可以根据需要或如图所示重写
isCellEditable()


我不知道!非常感谢,我将尝试并查看一些示例,尝试并编写一个符合我需要的模型!非常感谢。我可以使用自定义模型,但我遇到了两个小问题,如我编辑的初始问题所述,介意看一看吗?覆盖
getColumnClass()
,如原始生成的代码或上面引用的第二个示例所示。这解决了复选框问题,但当它的状态改变时,我仍然会得到异常:线程“AWT-EventQueue-0”java.lang.NullPointerException中的异常位于SimGui$1.actionPerformed(SimGui.java:167)为166167:boolean b=boolean.parseBoolean(String.valueOf(tcl.getNewValue());Table1 model.setColumnEditable(tcl.getColumn(),b);否,
isCellEditable()
控制每个单元格;默认编辑器基于列类;请阅读引用的文章,如果你还有问题,请编辑你的问题,包括一个我不知道的问题!非常感谢,我将尝试并查看一些示例,尝试并编写一个符合我需要的模型!非常感谢。我可以使用自定义模型,但我遇到了两个小问题,如我编辑的初始问题所述,介意看一看吗?覆盖
getColumnClass()
,如原始生成的代码或上面引用的第二个示例所示。这解决了复选框问题,但当它的状态改变时,我仍然会得到异常:线程“AWT-EventQueue-0”java.lang.NullPointerException中的异常位于SimGui$1.actionPerformed(SimGui.java:167)为166167:boolean b=boolean.parseBoolean(String.valueOf(tcl.getNewValue());Table1 model.setColumnEditable(tcl.getColumn(),b);否,
isCellEditable()
control