【问题标题】:My for loop isnt pointing to the correct attribute我的 for 循环没有指向正确的属性
【发布时间】:2011-04-13 20:45:09
【问题描述】:

我希望 for 循环在找到它设置为等于哪个菜单后指向价格。一旦我找到收银员选择的菜单,它将使用 getPrice() 方法并将其设置为等于字符串,然后将其设置为 JtTextField (totalText)。

问题是它总是显示 0.0 而不是我选择的价格,我该怎么办?

这里是菜单框架

// NamesFrame.java
//
// Informatics 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, 1.0, 1.0,
                GridBagConstraints.CENTER, GridBagConstraints.BOTH,
                new Insets(5, 10, 5, 10), 0, 0));


        JScrollPane menuListScrollPane = new JScrollPane(menuList);
        getContentPane().add(menuListScrollPane);
        layout.setConstraints(
            menuListScrollPane,
            new GridBagConstraints(
                0, 1, 2, 1, 1.0, 1.0,
                GridBagConstraints.CENTER, GridBagConstraints.BOTH,
                new Insets(5, 10, 5, 10), 0, 0));

        JScrollPane recieptListScrollPane = new JScrollPane();
        getContentPane().add(recieptListScrollPane);
        layout.setConstraints(
            recieptListScrollPane,
            new GridBagConstraints(
                3, 1, 2, 1, 1.0, 1.0,
                GridBagConstraints.CENTER, GridBagConstraints.BOTH,
                new Insets(5, 10, 5, 10), 0, 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, 2, 1, 1.0, 1.0,
                GridBagConstraints.CENTER, GridBagConstraints.BOTH,
                new Insets(5, 5, 5, 10), 0, 0));

        inputText = new JTextField();
        Font inputFont = new Font("Verdana", Font.BOLD, 30);
        totalText.setFont(inputFont);
        totalText.setForeground(Color.RED);
        getContentPane().add(inputText);
        layout.setConstraints(
            inputText,
            new GridBagConstraints(
                1, 3, 2, 1, 1.0, 1.0,
                GridBagConstraints.CENTER, GridBagConstraints.BOTH,
                new Insets(5, 10, 5, 10), 0, 0));

        JButton payLabel = new JButton("Pay");
        getContentPane().add(payLabel);
        layout.setConstraints(
            payLabel,
            new GridBagConstraints(
                3, 3, 2, 1, 1.0, 1.0,
                GridBagConstraints.CENTER, GridBagConstraints.BOTH,
                new Insets(5, 10, 5, 10), 0, 0));

        orderButton = new JButton("Order");
        new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {



            }
        };
        getContentPane().add(orderButton);
        layout.setConstraints(
            orderButton,
            new GridBagConstraints(
                0, 2, 1, 1, 0.5, 0.0,
                GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,
                new Insets(5, 10, 5, 5), 0, 0));

        cancelButton = new JButton("Cancel");
        //addButton.addActionListener(
            new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    cancelPressed(); 

                }
            };
        getContentPane().add(cancelButton);
        layout.setConstraints(
            cancelButton,
            new GridBagConstraints(
                1, 2, 1, 1, 0.0, 0.0,
                GridBagConstraints.EAST, GridBagConstraints.NONE,
                new Insets(5, 5, 5, 10), 0, 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, 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;

    }

    }

【问题讨论】:

    标签: java swing jlist jtextfield


    【解决方案1】:

    你的比较是错误的:

    selected.equals(mi[i].getItemName())menuItemString 之间进行比较。

    您应该从 menuList 中转换返回的 Object 并将其与数组中的 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();
    

    【讨论】:

    • 谢谢 :) 我怎样才能得到它,以便 totalText 可以保持计数并在收银员选择菜肴时自动将价格相加?我不希望价格只是加起来。
    • @osama - 我不明白这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    相关资源
    最近更新 更多