2012-07-24 44 views
0

我正在使用java和mySQL製作數據庫管理系統。我使用jTable作爲數據庫的接口。j表格單元格不變

雖然帖子看起來不長,但對於一個有經驗的人來說,這個問題不會那麼複雜,(我猜)。

這是我的問題。選擇一個單元格後,我可以輸入值,(沒有可能性)。但輸入值後,當我點擊其他單元格時,輸入的值將消失,並返回到空值。

找不出原因。我對jTables沒有太多經驗。但我認爲問題出在桌面模型上。

這是我的TableModel

import Templates.TableEntry; 
import java.util.LinkedList; 
import javax.swing.table.AbstractTableModel; 

public class myTableModel extends AbstractTableModel { 

public static final int DATE_INDEX = 0; 
public static final int ORDERNO_INDEX = 1; 
public static final int ROOT_INDEX = 2; 
public static final int HIDDEN_INDEX = 3; 
public String[] columnnames; 
public LinkedList<TableEntry> entryList; 

public myTableModel(String[] columnNames) { 
    this.columnnames = columnNames; 
    entryList = new LinkedList<TableEntry>(); 
} 

@Override 
public String getColumnName(int column) { 
    return columnnames[column]; 
} 

@Override 
public boolean isCellEditable(int row, int column) { 
    if (column == HIDDEN_INDEX) { 
     return false; 
    } else { 
     return true; 
    } 
} 

@Override 
public Class getColumnClass(int column) { 
    return String.class; 
} 

@Override 
public String getValueAt(int row, int column) { 
    TableEntry record = entryList.get(row); 
    switch (column) { 
     case DATE_INDEX: 
      return record.date; 
     case ORDERNO_INDEX: 
      return record.jobOdrerNo; 
     case ROOT_INDEX: 
      return record.rootCardNos; 
     default: 
      return null; 
    } 
} 

public void setValueAt(String value, int row, int column) { 
    TableEntry record = entryList.get(row); 
    switch (column) { 
     case DATE_INDEX: 
      record.date = value; 
      break; 
     case ORDERNO_INDEX: 
      record.jobOdrerNo = value; 
      break; 
     case ROOT_INDEX: 
      record.rootCardNos = value; 
      break; 
     default: 
      System.out.println("invalid index"); 
    } 
    updateTable(row, column); 
} 

public void updateTable(int row, int column) { 
    fireTableCellUpdated(row, column); 
} 

@Override 
public int getRowCount() { 
    return entryList.size(); 
} 

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

public boolean hasEmptyRow() { 
    if (entryList.size() == 0) { 
     return false; 
    } 
    TableEntry entry = entryList.get(entryList.size() - 1); 
    if ("".equals(entry.date)) { 
     return true; 
    } else { 
     return false; 

    } 
} 

public void addEmptyRow() { 
    entryList.add(new TableEntry()); 
    fireTableRowsInserted(entryList.size() - 1, entryList.size() - 1); 
} 

public void deleteRow(int i) { 
    if (i != 0) { 
     entryList.remove(i); 
     fireTableRowsDeleted(i - 1, i + 1); 
    } 
} 

}

很抱歉的長度。但爲了完整起見,我發佈了整個代碼。大部分零件都可以忽略。

TableEntry是一個簡單的類。

package Templates; 

public class TableEntry { 

public String date; 
public String jobOdrerNo; 
public String rootCardNos; 
public String yardRootCard; 
public String MCISO_NO; 
public String service_maintenance_breakdown; 
public String jobNo; 
public String machineName; 
public String fault; 
public String problematicPart; 
public String person; 
public String action; 
public String startTime; 
public String finishedTime; 
public String durationOfRepair; 
public String spareParts; 
public String itemCode; 
public String no; 
public String value; 
public String totalCost; 
public String remark; 
public String breakdownAndSolution; 

}

希望我提供所有的細節。這對我來說是一個真正的bug。任何幫助表示讚賞。 Thanx提前..!

(如果需要澄清,請讓我知道..難以發佈整個項目這是一個有點龐大..:d)

+3

*「(如果需要澄清,請讓我知道......難以發佈整個項目,這有點巨大..:D) 「*嘗試編輯一個表格,其中TableEntry有2個字段,表格只有2行。硬編碼數據以分解數據庫。如果[SSCCE](http://sscce.org/)失敗,並且您無法看到原因,請將其作爲對該問題的修改。 Thanx,我會試試.. – 2012-07-24 07:04:45

+2

Thanx!情況就是如此。它現在工作正常!.. thanx很多! – Anubis 2012-07-24 07:12:22

回答

2

有一個在你的代碼中的小bug。下一次,請小心......

在tablemodel的方法「setValueAt(---)」中,您輸入了錯誤的參數。您試圖重寫類「AbstractTableModel」的方法。原來的方法是,

public void setValueAt(Object aValue, int rowIndex, int columnIndex){ 
} 

但你寫你的方法,

public void setValueAt(String value, int row, int column) { 
...//method body 
} 

因此,它不會超越預期功能。每當單元格發生更改時,tablemodel都會調用原始的「setValueAt(...)」函數。但由於它沒有被覆蓋,它什麼都不會做(你必須重寫它,原始方法沒有主體)。

希望這有助於..

+2

Thanx !!! – Anubis 2012-07-24 08:17:57

+3

*「它不會覆蓋預期的功能」*這是@Override表示法可以非常有用的地方。 – 2012-07-24 09:04:15

1

可以使用defaultTableModal正常使用。它擴展了abstractTableModal併爲常用的需求提供方法。先試試吧,如果還不夠,那就去開發你自己的班......