Java 数据库和重新加载表模型中的Swing表更新值
我想在DB中更新swing表的行值,清除模型,并用新的更新值加载新模型。问题是,当我单击按钮更新值时,模型被清除,但表中没有显示任何数据。我做错了什么 为了简化示例,删除了与表无关的部分代码 公共类ShowValues扩展了JFrame{Java 数据库和重新加载表模型中的Swing表更新值,java,swing,jtable,Java,Swing,Jtable,我想在DB中更新swing表的行值,清除模型,并用新的更新值加载新模型。问题是,当我单击按钮更新值时,模型被清除,但表中没有显示任何数据。我做错了什么 为了简化示例,删除了与表无关的部分代码 公共类ShowValues扩展了JFrame{ //Attributes private DefaultTableModel model; private JTable table = new JTable() { public boolea
//Attributes
private DefaultTableModel model;
private JTable table = new JTable()
{
public boolean isCellEditable(int row, int column)
{
return false;
};
};
public ShowValues() {
btnDeleteItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0)
{
int selectedRowNumber = table.getSelectedRow();
String selectedItemId = (String) table.getModel().getValueAt(selectedRowNumber, 0);
//code to change selected item's state to deleted in the DB
model.setRowCount(0); //clear model
showTable(); //load new model
labelMsg.setText("Item deleted");
}
});
btnDeleteItem.setBounds(200, 320, 203, 57);
contentPane.add(btnDeleteItem);
}
public void showTable()
{
String columnNames[] = {"Item Id", "Item Name", "Item price"};
//code to get the data form the DB
String dataValues[][] = new String[itemNum][3];
for(int i=0; i<itemNum; i++)
{
dataValues[i][0] = idItem[i];
dataValues[i][1] = nameItem[i];
dataValues[i][2] = priceItem[i];
}
model = new DefaultTableModel(dataValues, columnNames);
table.setModel(model);
scrollPane = new JScrollPane(table);
scrollPane.setBounds(17, 20, 490, 205);
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
topPanel.add(scrollPane);
}
}
//属性
私有模型;
私有JTable表=新JTable()
{
公共布尔值可编辑(int行,int列)
{
返回false;
};
};
公众价值观(){
btnDeleteItem.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件arg0)
{
int selectedRownNumber=table.getSelectedRow();
字符串selectedItemId=(字符串)table.getModel().getValueAt(selectedLownNumber,0);
//将数据库中选定项目的状态更改为“已删除”的代码
model.setRowCount(0);//清除模型
showTable();//加载新模型
labelMsg.setText(“删除项”);
}
});
BTN删除项目.立根(200、320、203、57);
contentPane.add(btnDeleteItem);
}
公共空间显示表()
{
字符串columnNames[]={“项目Id”、“项目名称”、“项目价格”};
//从数据库中获取数据的代码
字符串数据值[][]=新字符串[itemNum][3];
对于(int i=0;i
//将数据库中选定项目的状态更改为“已删除”的代码
为什么仅仅因为更改了行中一个属性的值就要重新加载所有数据?这不是很有效
只需使用setValueAt(…)
方法更改JTable中的值
问题是,当我单击按钮更新值时,模型被清除,但表中没有显示任何数据
问题是您创建了一个新的JTable,但从未将该表添加到JScrollPane的视口中
解决方案是不创建新的JTable。只需创建一个新的TableModel。然后您就可以使用:
table.setModel( theNewlyCreateTableModel );
感谢您的回答。我将表添加到JScrollPane的视口中,但我没有发布该代码,只是为了使eample更容易,并专注于重新加载模型的特殊任务。我将表添加到JScrollPane的视口中
-不,您没有!!!ActionListener中的代码调用showTable()
method,它创建了一个新的JTable。该表从未添加到视口中。视口中仍然包含原始JTable,没有任何数据。确定。我已更新到showTable方法的最后几行,在该行中,我将表添加到JScrollPane的视口中,并仅创建了一个JTable。仍然存在相同的问题。您重新绘制了面板吗?您是否验证了该方法该模型实际上包含数据?发布的代码看起来合理,但没有整个代码的上下文,我们无法判断错误所在。为了使示例更简单,删除了与表无关的部分代码。
-发布随机代码行并不能使其更简单。发布一个适当的代码来演示问题em.我们无法访问您的数据库,因此您需要对数据进行“硬编码”以模拟您正在执行的操作。并且不要使用空布局!是的,它包含数据。如果我写入System.out.println(“model”+model.getRowCount()),它会显示模型中的行号。重新绘制面板是什么意思?可能是错误