如何使用自定义表模型将新行插入 JTable



我正在做一个涉及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(...)方法,以便向其添加新行。最您可能必须放大二维数组,即表模型在添加行时的基础数据结构。

  • 正如@AndrewThompson已经建议的那样,DefaultTableModel 似乎是一个非常适合执行表模型的功能。

  • 检查rowscolumnscount属性初始化。它没有对我来说似乎是对的。

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

我无法理解fireTableRowsInserted(int,int)方法。 参数本身和 调用方法的位置或时间

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

根据您的

问题,您希望每次用户单击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);
}
}

最新更新