2015-01-06 18 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); 

} 

} 
相关问题