我正在处理一个涉及JTable的小型项目,该项目要求用户单击一个按钮并向表中添加一行(我将按钮命名为addrow)。我使用了扩展默认表模型的自定义表模型(Mytablemodel)。
我的表首先由五行四列组成,之后用户可以单击addrow按钮添加更多行

我的代码中的所有内容均正常运行,但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);

}

}

最佳答案

有关代码的一些注意事项:


您永远都不应从中明确调用任何fireXxx()方法。
外。这些旨在由内部调用
AbstractTableModel子类在需要时。注意:恕我直言,那些应该
protected而不是public,以避免错误使用它们。但对于
他们将其公开的某些原因。
您的addrow按钮似乎创建了一个新的表模型
附加到任何JTable,因此没有任何意义。您的表模型应该
提供一个addRow(...)方法以便向其中添加新行。最
可能您将不得不扩大二维数组,即
每次添加行时,表模型的underlyinig数据结构。
正如@AndrewThompson已经建议的那样,DefaultTableModel似乎是
非常适合做您的表模型。
检查rowscolumnscount属性初始化。不是
对我来说似乎正确。


另一方面,您在评论中说:


  我在理解fireTableRowsInserted(int,int)方法时遇到麻烦。他们自己的参数和
  在何处或何时调用该方法


在第二点中,我建议您在addRow(...)中创建该方法。此方法应扩大数据结构并通知TableModelListeners已插入新行。参数分别是第一个和最后一个索引。通常,将新的单行追加到表模型的末尾时,第一个索引和最后一个索引都相同,并且基础数据结构的新大小为1。当然,可以插入几行,而不必在表模型的末尾插入几行,因此您必须找出适当的索引。请参见显示的示例here,该示例使用自定义对象的List作为数据结构。

08-03 12:09