Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果在JTable中重复,则更新值_Java_Swing_Jtable - Fatal编程技术网

Java 如果在JTable中重复,则更新值

Java 如果在JTable中重复,则更新值,java,swing,jtable,Java,Swing,Jtable,我在检查JTable中的重复值时遇到问题。用户输入“产品代码”和“金额”,应用程序正在使用“产品代码”查找项目名称,并将其添加到表值中。我想在JTable中检查重复项,但我不知道怎么做。我希望用户选择例如code:55和amount 3,然后将其添加到JTable中,但如果用户再次输入55和amount 5,它将添加另一行,我希望更新amount 3+5 到目前为止我就是这么做的 导入java.awt.BorderLayout; 导入java.awt.event.ActionEvent; 导入j

我在检查
JTable
中的重复值时遇到问题。用户输入“产品代码”和“金额”,应用程序正在使用“产品代码”查找项目名称,并将其添加到表值中。我想在
JTable
中检查重复项,但我不知道怎么做。我希望用户选择例如code:55和amount 3,然后将其添加到
JTable
中,但如果用户再次输入55和amount 5,它将添加另一行,我希望更新amount 3+5

到目前为止我就是这么做的

导入java.awt.BorderLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.util.Vector;
导入javax.swing.JButton;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.table.DefaultTableModel;
公共类StockBasket扩展JPanel实现ActionListener{
专用JTable表;
私有向量行、列;
私有默认表模型tabModel;
私有JScrollPane滚动窗格;
私有JButton addBtn、deleteBtn;
专用JPanel主面板,按钮面板;
私有字符串产品名称;
私有字符串安装;
私有int-quantityDbInt;
私人帐户;
公共储物篮(){
行=新向量();
列=新向量();
String[]columnNames={“更新金额”、“产品名称”,
“更新后库存总量”};
添加列(列名称);
tabModel=新的DefaultTableModel();
tabModel.setDataVector(行、列);
表=新JTable(tabModel);
表.changeSelection(0,0,false,false);
scrollPane=newJScrollPane(表);//scrollPane
setPreferredSize(新java.awt.Dimension(500200));
buttonPanel=新的JPanel();
addBtn=newjbutton(“添加到更新”);
deleteBtn=新的JButton(“删除”);
deleteBtn.setEnabled(false);
按钮面板添加(addBtn);
按钮面板添加(删除BTN);
addBtn.addActionListener(此);
deleteBtn.addActionListener(此);
mainPanel=新的JPanel();
主面板设置尺寸(450300);
setLayout(新的BorderLayout());
主面板。添加(“中心”,滚动窗格);
主面板。添加(“北”,按钮面板);
添加(主面板);
setVisible(真);
}
已执行的公共无效actionPerformed(ActionEvent源){
if(source.getSource()==(JButton)addBtn){
添加b检查();
}else if(source.getSource()==(JButton)deleteBtn){
deleteRow(table.getSelectedRow());
}
}
专用void addBtnChecks(){
productName=新的MyDatabase(3).getName();
amountInt=Integer.parseInt(UpdateStock.getAmount().getValue())
.toString());
if(新建MyDatabase(3).getQuantity()==null){
//如果来自db的答案为null,则不解析INT
}否则{
quantityDbInt=Integer.parseInt(新的MyDatabase(3.getQuantity());
}
如果(productName==null){
UpdateStock.getErrorMsg().setText(“输入正确的代码”);
}否则如果(amount==0){
UpdateStock.getErrorMsg().setText(“请输入正确的金额”);
}否则{
addRow();
UpdateStock.getAmount().setValue(0);
UpdateStock.getStockNo().setText(“”);
UpdateStock.getErrorMsg().setText(“”);
deleteBtn.setEnabled(真);
}
}
私有void addColumns(字符串[]colName){
for(int i=0;i
有很多方法可以做到这一点。最好的方法是在数据模型(包含数量的股票列表)和表模型(用JTable理解的方式表示的适配器)之间进行清晰的分离

List
开始,其中
StockHolding
是一个超级简单的类,用于保存一行的数据

public class StockHolding {
  private String product;
  private int quantity;
}
(添加构造函数和getProduct/getQuantity)

现在,当您输入新产品+金额时

addRequest(String product, int amount) {
  StockHolding holding = findInList(product, myList);
  if (holding == null) {
    myList.add(new StockHolding(product, amount));
  } else {
    holding.setQuantity(amount+holding.getQuantity());
  }
实现这一点的关键是用这个列表来表示您的表模型
getRowCount()
返回
myList.size()
单元格值为
getValue(myList.get(rowNum),columnNum)
其中
getValue()
分别将列号映射到产品或金额


这里的重要教训是,将express-as-a-table问题与存储数据问题隔离开来,使每个问题都更容易解决。

+1好问题,我认为关于在DefaultTableModel内迭代。。。。。。。,使用存储在本地变量中的值更新所有隐藏类确保您阅读并理解了关于JTable的教程章节(您的更新是完全错误的)调用随机api从来都不是一个选项(f.i.addNotify…tsee)。无关:a)永远不要摆弄大小提示(即不要调用setXXSize)b)请学习java命名约定并坚持them@kleopatra感谢您的提示,我不知道哪里没有Java命名约定。你能告诉我怎么更新吗