【问题标题】:Checkbox ItemListener Logic for a Pizza Ordering披萨订购的复选框 ItemListener 逻辑
【发布时间】:2012-09-28 23:21:17
【问题描述】:

这个简单的程序所做的基本上是 单击按钮时显示摘要, 披萨大小有三个单选按钮,浇头有三个复选框。 我遇到的问题是当用户第一次单击浇头,然后单击按钮并在 MessageDialog 中显示适当的摘要后,当用户想要没有浇头时,它不会显示“未选择浇头”

import java.applet.Applet;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.*;
import javax.swing.*;

public class PizzaOrdering extends Applet implements ActionListener, ItemListener {

    Button btnOk = new Button("OK");
    CheckboxGroup cbgSize = new CheckboxGroup();
    Checkbox chkSmall = new Checkbox("Small", cbgSize, false);
    Checkbox chkMedium = new Checkbox("Medium", cbgSize, false);
    Checkbox chkLarge = new Checkbox("Large", cbgSize, false);
    Checkbox chkPep = new Checkbox("Pepperoni");
    Checkbox chkMush = new Checkbox("Mushroom");
    Checkbox chkAnch = new Checkbox("Anchiovies");
    String pizza = "";
    String topping1 = "";
    String topping2 = "";
    String topping3 = "";
    String others = "with no toppings";
    Label lbl1 = new Label("Size");
    Label lbl2 = new Label("Toppings");
    Label spacer = new Label("                                                ");
    Label spacer2 = new Label("                                                ");

    @Override
    public void init() {
        resize(250, 150);
        add(lbl1);
        add(spacer);
        add(chkSmall);
        add(chkMedium);
        add(chkLarge);
        add(lbl2);
        add(spacer2);
        add(chkPep);
        add(chkMush);
        add(chkAnch);
        add(btnOk);
        chkAnch.addItemListener(this);
        chkPep.addItemListener(this);
        chkMush.addItemListener(this);
        btnOk.addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == btnOk) {
            if (cbgSize.getSelectedCheckbox() == chkSmall) {
                pizza = "Small";
            }
            if (cbgSize.getSelectedCheckbox() == chkMedium) {
                pizza = "Medium";
            }
            if (cbgSize.getSelectedCheckbox() == chkLarge) {
                pizza = "Large";
            }
            JOptionPane.showMessageDialog(btnOk, "You ordered a " + 
                    pizza + " pizza " + others, "Your Order", WIDTH);
        }
    }

    @Override
    public void itemStateChanged(ItemEvent ex) {
        boolean state1 = false;
        boolean state2 = false;
        boolean state3 = false;
        if (ex.getItemSelectable() == chkMush) {
            state1 = chkMush.getState();
            if (state1 == true) {
                topping1 = "Mushroom";
            } else if (state1 == false) {
                topping1 = "";
                if (state2 == false && state3 == false) {
                    others = "with no toppings";
                }
            }
        }

        if (ex.getItemSelectable() == chkPep) {
            state2 = chkPep.getState();
            if (state2 == true) {
                topping2 = "Pepperoni";
            } else if (state2 == false) {
                topping2 = "";
                if (state1 == false && state3 == false) {
                    others = "with no toppings";
                }
            }
        }

        if (ex.getItemSelectable() == chkAnch) {
            state3 = chkAnch.getState();
            if (state3 == true) {
                topping3 = "Anchiovies";

            } else if (state3 == false) {
                topping3 = "";
                if (state1 == false && state2 == false) {
                    others = "with no toppings";
                }
            }
        }
        others = " with the following topping:" + 
                topping1 + " " + topping2 + " " + topping3;
    }
}

【问题讨论】:

    标签: java checkbox applet awt itemlistener


    【解决方案1】:

    当用户没有选中或取消选中任何复选框时,甚至不会调用 itemStateChanged 方法。因此,在默认情况下放置“未选择顶部”标签,并在选择了某些顶部时在 itemStatechanged 方法中隐藏或删除它。您可以在 itemStateChanged 方法中使用静态 int 字段“计数”,并在每个选择的顶部增加它并在每个取消选择的顶部减少它。

    这样,对于每次取消选择,将计数减一并检查计数,如果为零,只需将“未选择顶部”的标签设置为可见或重新出现。

    【讨论】:

      【解决方案2】:

      以一种不可能在比萨本身之前选择浇头的方式安排您的流程(在提交信息时提出条件)。 默认情况下,消息是“未选择浇头”,当他选择浇头时,您会将新浇头附加到消息的新文本中。

      我建议您阅读装饰器设计模式 (http://en.wikipedia.org/wiki/Decorator_pattern ),这对您的应用很有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-12
        相关资源
        最近更新 更多