问题描述
|
我希望for循环在找到设置等于哪个菜单后指向价格。一旦我找到收银员选择了哪个菜单,它将使用getPrice()方法并将其设置为一个字符串,然后将该字符串设置为JtTextField(totalText)。
问题是它始终显示0.0,而不显示我选择的价格,我该怎么办?
这里是菜单框架
// NamesFrame.java
//
// @R_431_4045@ics 45 Spring 2010
// Code Example: GridBagLayouts,JLists,and ListModels
// Version 2
//
// This version of NamesFrame employs model/view separation. In order to
// do it,it stores a NameCollection (our model) instead of a DefaultListModel,// then implements its own custom ListModel that kNows how to handle event
// notifications from NameCollection and turn them into events that JLists
// can handle.
package inf45.spring2010.examples.gui3;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MenuFrame extends JFrame
{
private MenuCollection menu;
private JList menuList;
private JTextField newNameField;
private JList orderList;
private JButton orderButton,cancelButton;
private JTextField totalText;
private JTextField inputText;
DefaultListModel dm = new DefaultListModel();
public menuItem[] mi;
private double getPrice;
menuItem [] menuArray = new menuItem [13];
public MenuFrame()
{
menu = new MenuCollection();
setTitle(\"Senor Club\");
setSize(1000,1000);
setDefaultCloSEOperation(WindowConstants.disPOSE_ON_CLOSE);
menuArray[0] = new menuItem(\"Cheese Enchilada\",2.95,true);
menuArray[1]= new menuItem (\"Chicken Enchilada\",3.59,true);
menuArray[2]= new menuItem (\"Beef Taco\",1.69,true);
menuArray [3]= new menuItem (\"Chicken Taco\",1.89,true);
menuArray [4] = new menuItem (\"Fish Taco\",2.39,true);
menuArray [5] = new menuItem (\"Bean and Cheese Burrito\",3.19,true);
menuArray [6] = new menuItem (\"Chicken Burrito\",5.49,true);
menuArray [7] = new menuItem (\"Steak Burrito\",6.49,true);
menuArray [8] = new menuItem (\"Carnitas Burrito\",6.79,true);
menuArray [9] = new menuItem (\"Chips and Salsa\",.99,true);
menuArray [10] = new menuItem (\"Guacamole\",2.49,false);
menuArray [11] = new menuItem (\"Small Drink\",1.45,false);
menuArray [12] = new menuItem (\"Large Drink\",1.95,false);
mi = menuArray;
buildUI();
}
// All of the layout code has stayed the same. The only difference in
// this method is where we create the list model; instead of creating a
// DefaultListModel (which stores its own data),we create a NamesListModel,// our own custom list model that kNows how to interact with the
// NameCollection.
private void buildUI()
{
GridBagLayout layout = new GridBagLayout();
getContentPane().setLayout(layout);
NamesListModel listModel = new NamesListModel(menu);
menuList = new JList(menuArray);
menuList.addMouseListener(new MouseAdapter()
{
@Override
public void mousepressed(MouseEvent e)
{
Object selected = menuList.getSelectedValue();
System.out.println(\"menuList.addMouseListener.mousepressed selected=\" + selected);
DefaultListModel dm = (DefaultListModel) orderList.getModel();
dm.add(orderList.getModel().getSize(),selected);
for (int i = 0; i < menuArray.length; i++){
if (selected.equals(mi[i].getItemName())) {
getPrice = mi[i].getItemPrice();
}
}
String getdisplayPrice = getPrice + \"\";
totalText.setText(getdisplayPrice);
}
});
orderList = new JList(dm);
JScrollPane orderListScrollPane = new JScrollPane(orderList);
getContentPane().add(orderListScrollPane);
layout.setConstraints(
orderListScrollPane,new GridBagConstraints(
1,1,2,1.0,GridBagConstraints.CENTER,GridBagConstraints.BOTH,new Insets(5,10,5,10),0));
JScrollPane menuListScrollPane = new JScrollPane(menuList);
getContentPane().add(menuListScrollPane);
layout.setConstraints(
menuListScrollPane,new GridBagConstraints(
0,0));
JScrollPane recieptListScrollPane = new JScrollPane();
getContentPane().add(recieptListScrollPane);
layout.setConstraints(
recieptListScrollPane,new GridBagConstraints(
3,0));
totalText = new JTextField();
Font font = new Font(\"Verdana\",Font.BOLD,30);
totalText.setFont(font);
totalText.setForeground(Color.RED);
getContentPane().add(totalText);
layout.setConstraints(
totalText,new GridBagConstraints(0,3,0));
inputText = new JTextField();
Font inputFont = new Font(\"Verdana\",30);
totalText.setFont(inputFont);
totalText.setForeground(Color.RED);
getContentPane().add(inputText);
layout.setConstraints(
inputText,0));
JButton payLabel = new JButton(\"Pay\");
getContentPane().add(payLabel);
layout.setConstraints(
payLabel,0));
orderButton = new JButton(\"Order\");
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
}
};
getContentPane().add(orderButton);
layout.setConstraints(
orderButton,0.5,0.0,GridBagConstraints.WEST,GridBagConstraints.HORIZONTAL,5),0));
cancelButton = new JButton(\"Cancel\");
//addButton.addActionListener(
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
cancelpressed();
}
};
getContentPane().add(cancelButton);
layout.setConstraints(
cancelButton,GridBagConstraints.EAST,GridBagConstraints.NONE,0));
}
// In this method,we add the new name to the NameCollection instead of
// adding it directly to the list model. This sets off a chain of events:
//
// * NameCollection notifies its listener,the NamesListModel,that a name
// has been added.
// * NamesListModel notifies its listener,the JList,that an \"interval\"
// (a subsequence of the elements) has changed.
// * JList redraws the affected elements (if they\'re visible).
//
private void addName()
{
String newName = newNameField.getText().trim();
if (newName.isEmpty())
{
JOptionPane.showMessageDialog(
this,\"No name was specified. Please enter a name.\",\"No Name Specified\",JOptionPane.ERROR_MESSAGE);
}
else
{
menu.add(newName);
newNameField.setText(\"\");
}
}
// In this method,we remove the name from the NameCollection instead of the
// list model,which sets off the same chain of events that addName() does.
// This is a custom list model. It extends AbstractListModel,which
// provides a basic implementation of some of the ListModel functionality,// while leaving the important parts of it (namely,how to figure out how
// large the collection is and how to get an element from the collection)
// unimplemented; this class implements those two elements,which are
// called getSize() and getElementAt().
//
// Our list model also implements the NameCollectionChangedListener
// interface,so that it can receive change events from the NameCollection.
// It\'s legal in Java for a class to extend another class and implement
// an interface. (In fact,it\'s legal for a class to extend a class and
// implement multiple interfaces,if you\'re so inclined.) It\'s not legal,// however,for a class to extend multiple other classes.
private class NamesListModel
extends AbstractListModel
implements NameCollectionChangedListener
{
// The list model will operate on the collection,so we\'ll need to
// store a reference to the collection inside the list model.
private MenuCollection collection;
// When we create the list model,we need to store the collection
// and register the list model as a listener on the collection,// so that whenever the collection is changed,the list model
// will be notified.
public NamesListModel(MenuCollection collection)
{
this.collection = collection;
collection.addNameCollectionChangedListener(this);
}
// This is the method that will be called whenever the NameCollection
// has a name added to it. What it does is fire an \"interval added\"
// event,which is how it tells its JList that some subsequence of
// elements has changed. The three parameters are (1) who sent the
// event,(2) where the sequence of changed elements begins,and
// (3) where the sequence of changed elements ends. In our case,the
// sequence of changed elements is just the one element,so we say
// \"index\" in both places; why the method specifies the beginning and
// end separately is so that you can cheaply add,say,10 elements
// without having to fire 10 events.
public void nameAdded(int index)
{
fireIntervalAdded(this,index,index);
}
// This is the method that will be called whenever the NameCollection
// has a name removed from it. It does something similar to nameAdded(),// except that it notifies its JList about the removal of an element,// appropriately,instead of the addition of an element.
public void nameRemoved(int index)
{
fireIntervalRemoved(this,index);
}
// Whenever the JList asks the list model how many elements there are
// in the list,the list model will just ask the collection \"How many
// names have you got?\"
public int getSize()
{
return collection.getSize();
}
// Whenever the JList asks the list model what element is at a
// particular index,the list model will just ask the collection
// \"What name is at this index?\"
public Object getElementAt(int index)
{
return collection.get(index);
}
}
private void cancelpressed()
{
dispose();
}
public void addMenu ()
{
}
}
这是我为菜单创建的课程
package inf45.spring2010.examples.gui3;
import java.text.DecimalFormat;
public class menuItem {
private String name;
private double price;
private boolean taxable;
public int index;
//menuArray = new string [10];
public menuItem(String name,double price,boolean taxable)
{
this.name = name;
this.price = price;
this.taxable = taxable;
}
public String getItemName()
{
return name;
}
public double getItemPrice()
{
double d = price;
DecimalFormat df = new DecimalFormat(\"#.##\");
return Double.valueOf(df.format(d));
}
public String toString()
{
String s = \"\";
s += name + \": $\" + getItemPrice();
return s;
}
public boolean isTaxable()
{
return taxable;
}
}
解决方法
您的比较是错误的:
selected.equals(mi[i].getItemName())
比较menuItem
和String
。
您应该转换从menuList返回的对象,并将其与数组中的menuItem比较
menuItem selected = (menuItem)menuList.getSelectedValue();
...
for (int i = 0; i < menuArray.length; i++){
if (selected.equals(mi[i])) {
getPrice = mi[i].getItemPrice();
或更好 -
int selected = menuList.getSelectedIndex();
getPrice = mi[selected].getItemPrice();