2011-12-04 113 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);