2011-12-04 79 views
2

我试图使用户双击时JTable的所有单元不可编辑。我已经阅读了很多论坛帖子,一般的共识是创建一个新的表模型类,扩展DefaultTableModel,然后重写方法isCellEditable(int row,int column)。我做了所有这些,现在当我运行我的程序(applet)时,单元中没有任何东西显示出来。 注意我有一个教授这学期不认为小程序已经过时......使JTable单元不可编辑

代码表型号:

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大师可以找到我的错误:)

+0

请参阅编辑以回答问题。 –

回答

6

该行创建了一个新的JTable和暗中创建幕后一个DefaultTableModel,一个包含所有需要对JTable正确的数据:

storesTable = new JTable(tableData, COL_NAMES); 

而此行有效地消除隐式创建上面的表格模型,包含所有表的数据,并保存没有任何数据的表模型替换它的一个:

storesTable.setModel(new MyTableModel()); 

你需要给你的MyTableModel类一个构造函数,并在该构造函数中调用超级构造函数,并将当前传递给表的构造函数中的数据传入。

例如,

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

嘿,这工作很好。我从来没有与表模型或任何与Swing GUI – codeMasterFiveThousand

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++) { 
     } 

    } 

} 
} 
+0

请重写此方法在表中calss @Override public boolean isCellEditable(int row,int col){ return false; } – Sandeep

2

只是覆盖DefaultTableModel类的isCellEditable方法。快速的方法:

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