这种方法有什么问题 - (在 Jlist 中添加元素)?

What is wrong with this method - (Adding Elements within a Jlist)?

我目前正在创建购物车模拟程序。主 GUI 包含两个列表,一个是产品列表或库存。 (产品存储在启动时自动加载的 .dat 文件中)另一个是空白的,用于模拟我的购物篮。这个想法是能够将我的库存中的物品扫描到结账篮中。当发生这种情况时,我想要一个我创建的文本字段来动态更新购物篮中所有项目的成本。

下面是我的扫描按钮的方法,它应该执行上面的操作:

 public void actionPerformed(ActionEvent evt) {
      //Get the newly added list values.
      JList list = productList.getSelectedValuesList();
      double totalAddedValue = 0.0;
      double oldCartValue    = 0.0;

  //Iterate to get the price of the new items.
  for (int i = 0; i < list.getModel().getSize(); i++) {
    CartItem item = (CartItem) list.getModel().getElementAt(i);
    totalAddedValue += Double.ParseDouble(item.getPrice());
  }

  //Set total price value as an addition to cart total field.

  //cartTotalField must be accessible here.
  string cartFieldText = cartTotalField.getText();

  //Check that cartTextField already contains a value.
  if(cartTextField != null && !cartTextField.isEmpty())
  {
    oldCartValue = Double.parseDouble(cartFieldText);
  }

  cartTotalField.setText(String.valueOf(oldCartValue  + totalAddedValue));
  checkoutBasket.addElement(list);
}

目前扫描该项目会将其添加到列表中,但总计会打印出奇怪的结果。 (无论其实际价值如何**,每件物品增加 5.5)。它还会在项目名称下打印一行 javax.swing.JList[,0,0,344x326,layout=java.awt.BorderLa... .

下面是我的 CartItem 和 ItemList 的 类,如果它们可能有帮助的话。谢谢你。

-购物车商品

import java.io.*;

public class CartItem implements Serializable {

    private String barcodeNo;
    private String itemName;
    private String price;

    public CartItem() {

    }

    public CartItem (String barno, String in, String cost) {
            barcodeNo = barno;
            itemName = in;
            price = cost;
    }

    public String getBarcodeNo(){
        return barcodeNo;
    }

    public String getItemName(){
        return itemName;
    }

    public void setitemName(String itemName){
            this.itemName = itemName;
        }

    public String getPrice(){
        return price;
    }


    public String toString(){
        return barcodeNo + ": " + itemName + ", " + price;
    }

    public Object getID() {
        // TODO Auto-generated method stub
        return null;
    }
}

-物品清单

import javax.swing.DefaultListModel;

public class ItemList extends DefaultListModel {
    public ItemList(){
        super();
    }
public void addCartItem(String barcodeNo, String itemName, String price){
    super.addElement(new CartItem(barcodeNo, itemName, price));
}

public CartItem findItemByName(String name){
    CartItem temp;
    int indexLocation = -1;
    for (int i = 0; i < super.size(); i++) {
        temp = (CartItem)super.elementAt(i);
        if (temp.getItemName().equals(name)){
            indexLocation = i;
            break;
        }
    }

    if (indexLocation == -1) {
        return null;
    } else {
        return (CartItem)super.elementAt(indexLocation);
    }
}

public CartItem findItemByBarcode(String id){
    CartItem temp;
    int indexLocation = -1;
    for (int i = 0; i < super.size(); i++) {
        temp = (CartItem)super.elementAt(i);
        if (temp.getBarcodeNo().equals(id)){
            indexLocation = i;
            break;
        }
    }

    if (indexLocation == -1) {
        return null;
    } else {
        return (CartItem)super.elementAt(indexLocation);
    }        
}

public void removeItem(String id){
    CartItem empToGo = this.findItemByBarcode(id);
    super.removeElement(empToGo);
}

}

您正在将 JList 本身 添加到结帐篮中,这没有意义:

checkoutBasket.addElement(list);

javax.swing.JList[,0,0,344x326,layout=java.awt.BorderLa... . 表明某些东西正在显示 JList 的 toString() 表示,可能是您的结帐篮。


关于,

Adds 5.5 for each item regardless of their actual value

我认为您当前的代码没有说明为什么会发生这种情况,您可能想要创建 post 一个 mcve.

其他想法:

  • 不要使用 String 来表示价格,而是考虑一个数字字段,如果你想要准确的金钱,可以考虑使用 BigDecimal。
  • 您看起来将您的视图与您的模型混合得太多了。尽量将它们分开,这意味着,您可能应该有更多的非 GUI 类,包括一个代表购物篮的名词,以及任何其他名词。