我正在处理涉及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);
}
}
答案 0 :(得分:2)
关于您的代码的一些注意事项:
你永远不应该从中明确地调用任何fireXxx()
方法
外。这些内容旨在由内部调用
需要时AbstractTableModel
个子类。注意:恕我直言那些应该
是protected
而不是public
,以避免错误地使用它们。但对于
他们把它们公之于众的原因。
您的addrow
按钮似乎创建了一个新的表模型
附加到任何JTable所以没有意义。你的桌子型号应该
提供addRow(...)
方法以向其添加新行。最
可能你将不得不扩大二维数组
每当添加一行时,表格模型的数据结构就不足了。
正如@AndrewThompson已经建议的那样,DefaultTableModel似乎是一个 很好地匹配您的桌面模型。
检查rows
和columnscount
属性初始化。它没有
对我来说似乎是对的。
另一方面,你在评论中说:
我无法理解
fireTableRowsInserted(int,int)
方法。参数本身和 何时或何时调用方法
应该在我建议您在第二点创建的addRow(...)
内调用此方法。此方法应扩大数据结构并通知TableModelListeners
已插入新行。参数分别是第一个和最后一个索引。简而言之,当您将新的单行附加到表模型的末尾时,第一个和最后一个索引都是相同的,而新的大小 - 基础数据结构的1。当然,可以插入几行而不一定在表模型的末尾,因此您必须找出适当的索引。请参阅显示的示例here,该示例使用List
个自定义对象作为数据结构。
答案 1 :(得分: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);
}
}