2015-01-06 35 views
0

我正在研究一個涉及JTable的小項目,該項目要求用戶單擊按鈕並在表中添加一行(我已將該按鈕命名爲addrow)。我使用了擴展默認表模型的自定義表模型(Mytablemodel)。 我表首先由五個行4列,其中之後,用戶可以點擊按鈕addrow要添加更多的行如何使用自定義表模型將新行插入到JTable中?

一切都在我的代碼工作,除了addrow按鈕,什麼也不做精。我會感謝任何幫助。

public class AddingNewRows extends JFrame { 
JTable mytable; 
JButton addrow; 
String[] columns={"Admission number","Name","School","Year"}; 
TableColumn tc; 
int defaultrows=5; 
int rows=new Mytablemodel().getRowCount(),columnscount=new Mytablemodel().getColumnCount(); 
List data=new ArrayList(); 
Mytablemodel mytbm; 
// 
public AddingNewRows(){ 
super("adding rows"); 
for(int initialrows=0; initialrows<5; initialrows++){ 
    String[] items={"1","2","3","4"}; 
data.add(items); 
} 
mytbm=new Mytablemodel(); 
mytable=new JTable(mytbm); 

JScrollPane scroll=new JScrollPane(mytable); 
addrow=new JButton("ADD ROW"); 
// 
JPanel buttonpanel=new JPanel(); 
buttonpanel.setLayout(new BoxLayout(buttonpanel,BoxLayout.X_AXIS)); 
buttonpanel.setAlignmentX(Component.RIGHT_ALIGNMENT); 
buttonpanel.add(addrow); 

// 
add(scroll,BorderLayout.CENTER); 
add(buttonpanel,BorderLayout.SOUTH); 

addrow.addActionListener(new Myactions()); 

} 
public class Mytablemodel extends DefaultTableModel{ 

@Override 
public String getColumnName(int column) { 
    return columns[column]; 
} 
@Override 
public Object getValueAt(int row, int col){ 
return ((String[])data.get(row))[col]; 
} 
@Override 
public boolean isCellEditable(int row, int col){ 
    return true; 
} 
@Override 
public void setValueAt(Object value,int row, int col){ 
    ((Object[])data.get(row))[col]=value; 
    fireTableCellUpdated(row,col); 

} 
@Override 
public Class getColumnClass(int column){ 
    return getValueAt(0,column).getClass(); 
} 
@Override 
public int getColumnCount(){ 
    return columns.length; 
} 

@Override 
public int getRowCount(){ 
    return increaserows; 
} 

@Override 
public void addRow(Object[] mynewdata){ 
    int rownum=data.size(); 
    System.out.println(rownum); 
    data.add(madata); 
fireTableRowsInserted(rownum,rownum); 
} 

} 
// 
private class Myactions implements ActionListener{ 

@Override 
public void actionPerformed(ActionEvent event){ 
if(event.getSource()==addrow){ 
    Object[]newdata={"","","",""}; 
    mytbm.addRow(newdata); 
} 
} 
} 
public static void main(String[] args) { 

AddingNewRows frame=new AddingNewRows(); 
frame.setVisible(true); 
    frame.setSize(400,400); 
    frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE); 

} 

} 
+1

用小寫字母輸入的單詞難以閱讀,就像試圖聽別人嘟。一樣。請在句子的開頭使用大寫字母,單詞I以及諸如'ArrayList'或Oracle的專有名稱。 –

+1

'Mytablemodel擴展了AbstractTableModel {'幫你一個忙,改爲擴展** DefaultTableModel **。它爲你做這種類型的東西。但爲了更快提供更好的幫助,請發佈[MCVE](http://stackoverflow.com/help/mcve)(最小完整可驗證示例)或[SSCCE](http://www.sscce.org/)(Short,Self包含,正確示例)。 –

+0

@AndrewThompson在表中輸入的所有數據稍後通過onther按鈕保存到數據庫中,這工作正常。這就是爲什麼我使用自定義表模型,因爲我不認爲我可以使用DefaultTableModel將數據保存到數據庫中。此外,AM HAVING TROUBLE瞭解fireTableRowsInserted(int,int)方法。參數本身以及何時或何時調用方法 –

回答

2

你的代碼的一些注意事項:

  • 你不應該明確地從外面 調用任何的fireXxx()方法。這些打算在需要時由 AbstractTableModel子類內部調用。注意:恕我直言那些應該 是protected而不是public,以避免錯誤地使用它們。但對於 他們公開他們的某些原因。

  • 您的addrow按鈕似乎創建了一個新的表格模型,它不是連接到任何JTable的 ,所以它沒有任何意義。您的表格型號 會提供addRow(...)方法以向其添加新行。大多數 可能您將不得不放大任何時候添加行時表格模型的underlyinig數據結構的二維數組。

  • 作爲@AndrewThompson已經建議,DefaultTableModel似乎 良好的匹配做你的表模型。

  • 檢查rowscolumnscount屬性初始化。它不 似乎對我來說。

在另一方面,你在一個評論說:

我無法理解fireTableRowsInserted(int,int)方法。在哪時要調用的方法

此方法的參數自理和 應addRow(...)內被稱爲是我建議你在第二點創建。此方法應擴大數據結構並通知TableModelListeners已插入新行。這些參數分別是第一個和最後一個索引。最後,當你在表模型的末尾附加一個新的單行時,那麼第一個和最後一個索引都是相同的,並且新的大小-1是基礎數據結構。當然,可以插入幾行而不一定在表模型的末尾,因此您必須找出合適的索引。請參閱here示例,該示例使用自定義對象的List作爲數據結構。

+0

19我的回答,您究竟是什麼意思?例如,我有5行,當我想添加第6行,我會說fireTableRowsUpdated(6,6)? –

+0

在這種情況下,您應該調用'fireTableRowsInserted(5,5)',因爲Java中的索引從0開始計數(索引5是第6行)。注意我已經通知了行***插入***(不*更新*),因爲您想*實際添加*新行。 @gikarasojokinene – dic19

+0

因此,第一個索引表示插入的行,第二個索引表示該行應具有的列。我對嗎? –

0

根據你的問題,你想每次用戶點擊addrow按鈕時添加新的行。 通過使用DefaultTableModel而不創建自己的或覆蓋的addrow方法來實現您的目標。 在下面的示例中,DefaultTableModel構造函數中的參數表示在執行後,表所具有的初始行(5)和列(4),用戶可以通過單擊addrow按鈕來添加更多行。

public class AddingNewRows extends JFrame { 
DefaultTableModel def; 
JTable mytable; 
JButton addrow; 
// 
public AddingNewRows(){ 
super("adding rows"); 

def=new DefaultTableModel(5,4); 
mytable=new JTable(def); 

JScrollPane scroll=new JScrollPane(mytable); 
addrow=new JButton("ADD ROW"); 
// 
JPanel buttonpanel=new JPanel(); 
buttonpanel.setLayout(new BoxLayout(buttonpanel,BoxLayout.X_AXIS)); 
buttonpanel.add(addrow); 

// 
add(scroll,BorderLayout.CENTER); 
add(buttonpanel,BorderLayout.SOUTH); 

addrow.addActionListener(new Myactions()); 

} 

private class Myactions implements ActionListener{ 

@Override 
public void actionPerformed(ActionEvent event){ 
if(event.getSource()==addrow){ 
Object[]newdata={"","","",""}; 
def.addRow(newdata); 
} 
} 
} 
public static void main(String[] args) { 
AddingNewRows frame=new AddingNewRows(); 
frame.setVisible(true); 
frame.setSize(400,400); 
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE); 

} 

} 
相關問題