gpt4 book ai didi

java - 如何使用自定义表模型将新行插入到 JTable 中?

转载 作者:行者123 更新时间:2023-12-02 05:05:53 26 4
gpt4 key购买 nike

我正在开发一个涉及 JTable 的小项目,该项目要求用户单击一个按钮并向表中添加一行(我已将该按钮命名为 addrow >)。我使用了自定义表模型(Mytablemodel),它扩展了默认表模型。我的表格首先由 5 行 4 列组成,之后用户可以单击 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);

}

}

最佳答案

有关代码的一些注释:

  • 您永远不应该从外部。这些旨在由内部调用AbstractTableModel 在需要时创建子类。注意:恕我直言,那些应该 protected 而不是公开,以避免错误使用它们。但对于他们出于某种原因将其公开。

  • 您的 addrow 按钮似乎创建了一个新的表格模型,但它不是附加到任何 JTable,因此它没有任何意义。你的 table 模型应该提供一个 addRow(...) 方法以便向其中添加新行。最多可能你必须扩大二维数组每当添加一行时,表模型的底层数据结构。

  • 正如@AndrewThompson 已经建议的那样,DefaultTableModel似乎是与您的表格模型的功能非常匹配。

  • 检查rowscolumnscount属性初始化。事实并非如此对我来说似乎是正确的。

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

I'm having trouble understanding the fireTableRowsInserted(int,int) method. the parameters themself and where or when to call the method

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

关于java - 如何使用自定义表模型将新行插入到 JTable 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27798417/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com