这种方法有什么问题 - (在 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 类,包括一个代表购物篮的名词,以及任何其他名词。
我目前正在创建购物车模拟程序。主 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 类,包括一个代表购物篮的名词,以及任何其他名词。