以下是我写的代码,以帮助您执行以下操作:
从jComboBox中选择要添加到jTable,然后检查它以查看它在下面遇到的三个条件中的哪一个:如果table为空,则添加它。如果表中存在从组合框中选择的项,则现有行的qty值增加1。或者,如果它已经没有在桌面上,则会添加它。
但我所说的是非常奇怪的行为如下:
第一行添加到表格中,值为“200”(因为在此选择之前表格为空,所以应为“100”)。
从组合框中选择第二项,第一行(上面)的值更改为“100”(这应该在第一次选择时发生)。此外,从组合框中选择的第二个项目被添加到表格两次(两个相同的行),值为“300”,值正确但应该只有一行。
组合中的第三个选项与上面的2相同,所以值是正确的,但应该只有一行
选择组合框中的第四个选项,这次是为了匹配表中的现有行,而不是更新现有行中的值,它还添加两行,值为“300”。
我想也许我的循环错了,但我现在已经落后于一个试图解决这个问题的项目了,所以任何帮助都会被大大收到......
提前致谢
final DefaultTableModel model = (DefaultTableModel)main.tillPanel.tblTillSale.getModel();
//populate the combo box
for (int d = 0; d < roundStockObj.length ; d++) {
main.tillPanel.cmbTillProdSelect.addItem(roundStockObj[d].getDescription());
}
//add selection listener to combo
main.tillPanel.cmbTillProdSelect.addItemListener(new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
String[] addSelectedItem = new String[4];
selectedItem = main.tillPanel.cmbTillProdSelect.getSelectedItem();
for (int d = 0; d < roundStockObj.length; d++) {
//when selction form combo is matched, an array is created to hold the row data
if (roundStockObj[d].getDescription().equals(selectedItem)) {
addSelectedItem[0] = roundStockObj[d].getDescription();
addSelectedItem[2] = Double.toString(roundStockObj[d].getPrice()).trim();
addSelectedItem[3] = Double.toString(roundStockObj[d].getPrice()).trim();
}
}
main.tillPanel.tblTillSale.removeRowSelectionInterval(0, model.getRowCount());
//if table is empty
for (int rowCount = 0 ; rowCount <= model.getRowCount(); rowCount++) {
if (model.getRowCount() == 0 ) {
addSelectedItem[1] = "100";
model.addRow(new String[]{addSelectedItem[0], addSelectedItem[1], addSelectedItem[2], addSelectedItem[3]});
//main.tillPanel.tblTillSale.getModel().setValueAt(selectedItem, tillSelectedRow, tillSelectedRow);
main.tillPanel.lblTotPrice.setText("100");
break;
}
// look for duplicate row and if found increase total column of existing row, and not add this selection
if(addSelectedItem[0].equals(main.tillPanel.tblTillSale.getValueAt(rowCount, 0))) {
main.tillPanel.lblTotPrice.setText("200");
int currentValue = Integer.parseInt(addSelectedItem[1].trim());
addSelectedItem[1] = "200";
model.setValueAt(addSelectedItem[1], rowCount, 1);
break;
}
//if no duplicate found add this row to the table
else {
addSelectedItem[1] = "300";
model.addRow(new String[]{addSelectedItem[0], addSelectedItem[1], addSelectedItem[2], addSelectedItem[3]});
main.tillPanel.lblTotPrice.setText("300");
break;
}
}
//clear the current selection array of row data
for (int index = 0; index < 4; index++) {
ddSelectedItem[index] = null;
}
}
});
答案 0 :(得分:0)
编辑:等等,为什么在每个if或者其他内部都有break语句。你的循环只会运行一次。因此,如果它没有找到第一遍的值,它将退出。
取消休息陈述。同时移动if语句以检查表是否为循环外的表。
答案 1 :(得分:0)
for (int rowCount = 0 ; rowCount <= model.getRowCount(); rowCount++)
我猜你的意思是
for (int rowCount = 0 ; rowCount < model.getRowCount(); rowCount++)
否则你会在最后一次迭代中得到一个IndexOutOfBoundException(当rowCount == model.getRowCount()
时)。
编辑:
//查找重复行,如果找到则增加现有行的总列数,并且不添加此选择
您不会查找重复的行,但会检查第一个行是否重复。如果没有,你再次添加相同的项目(“300”)。
这会更好:
//model is empty
if(model.getRowCount() == 0) {
//add first (case "100")
}
//model is not empty
else {
//check if there is a duplicate row
int duplicateRow = -1;
for (int row = 0 ; row < model.getRowCount(); row++) {
if(addSelectedItem[0].equals(main.tillPanel.tblTillSale.getValueAt(row,0))) {
duplicateRow = row;
break;
}
}
//if there is no duplicate row, append
if(duplicateRow == -1) {
//append (case "300")
}
//if there is a duplicate row, update
else {
//update row with index duplicateRow (case "200")
}
}
答案 2 :(得分:0)
查看代码我强烈怀疑问题是中断,他们正在将你的for循环转换为if-else设置。它们是你只看第一行的原因,我怀疑你实际上是想继续使用而不是中断(除了表是空的情况)。
假设这些块的内容是正确的,我认为这应该是你所追求的:
if (model.getRowCount() == 0 ) {
//if table is empty, just add
addSelectedItem[1] = "100";
model.addRow(new String[]{addSelectedItem[0], addSelectedItem[1], addSelectedItem[2], addSelectedItem[3]});
//main.tillPanel.tblTillSale.getModel().setValueAt(selectedItem, tillSelectedRow, tillSelectedRow);
main.tillPanel.lblTotPrice.setText("100");
}else {
//table not empty, look for duplicates first
boolean found = false;
for (int rowCount = 0 ; rowCount < model.getRowCount(); rowCount++) {
// look for duplicate row
if(addSelectedItem[0].equals(main.tillPanel.tblTillSale.getValueAt(rowCount, 0))) {
//found the item : increase total column of existing row
found = true;
main.tillPanel.lblTotPrice.setText("200");
int currentValue = Integer.parseInt(addSelectedItem[1].trim());
addSelectedItem[1] = "200";
model.setValueAt(addSelectedItem[1], rowCount, 1);
}else {//not this row
}
}
if( found == false) {
//checked all rows without finding it : add this selection
addSelectedItem[1] = "300";
model.addRow(new String[]{addSelectedItem[0], addSelectedItem[1], addSelectedItem[2], addSelectedItem[3]});
main.tillPanel.lblTotPrice.setText("300");
} else {
}
}
另外(不知道上下文),看看这些行:
int currentValue = Integer.parseInt(addSelectedItem [1] .trim()); addSelectedItem [1] =“200”;
这意味着:
int currentValue = Integer.parseInt(addSelectedItem [1] .trim()); addSelectedItem [1] =“”+(currentValue + 100);
目前,您解析的这个值会在块的末尾被丢弃 另请注意:
public static int parseInt(String s) 抛出NumberFormatException
您需要在任何解析
周围包含try / catch块