1

我的 java 复选框小程序有问题。我让它大部分工作,但我最终遇到了一个小错误。当我选择汤时,沙拉应该是灰色的(确实如此),但如果我已经从沙拉中选择了一个项目,然后单击汤,沙拉将变为灰色,并且仍选择该项目(沙拉内)。

public class Applet_11 extends Applet implements ItemListener
{
Panel
    dinnerPanel,
    soupPanel,
    saladPanel;

Checkbox
    standard, deluxe,
    soup, salad, 
    cream, broth, gumbo,
    tossed, caesar,
    croutons,lite;

//Used to setup all of the boxes and add them to the Applet
public void init()
{
    CheckboxGroup dinnerType = new CheckboxGroup();
    standard = new Checkbox("standard", dinnerType, false);
    standard.addItemListener(this);
    deluxe = new Checkbox("deluxe", dinnerType, true);
    deluxe.addItemListener(this);

    CheckboxGroup soupOrSalad = new CheckboxGroup();
    soup = new Checkbox("Soup", soupOrSalad, false);
    soup.addItemListener(this);
    salad = new Checkbox("Salad", soupOrSalad, false);
    salad.addItemListener(this);

    CheckboxGroup soups = new CheckboxGroup();
    cream = new Checkbox("cream", soups, false);
    cream.addItemListener(this);
    broth = new Checkbox("broth", soups, false);
    broth.addItemListener(this);
    gumbo = new Checkbox("gumbo", soups, false);
    gumbo.addItemListener(this);

    CheckboxGroup salads = new CheckboxGroup();
    tossed = new Checkbox("tossed", salads, false);
    tossed.addItemListener(this);
    caesar = new Checkbox("ceasar", salads, false);
    caesar.addItemListener(this);
    croutons = new Checkbox("croutons", salads, false);
    croutons.addItemListener(this);
    lite = new Checkbox("lite", salads, false);
    lite.addItemListener(this);

    //adding the componets to the Applet
    setLayout(new GridLayout(0, 1));

    dinnerPanel = new Panel();
    add(dinnerPanel);
    dinnerPanel.add(standard);
    dinnerPanel.add(deluxe);

    soupPanel = new Panel();
    add(soupPanel);
    soupPanel.add(soup);
    soupPanel.add(cream);
    soupPanel.add(broth);
    soupPanel.add(gumbo);

    saladPanel = new Panel();
    add(saladPanel);
    saladPanel.add(salad);
    saladPanel.add(tossed);
    saladPanel.add(caesar);
    saladPanel.add(croutons);
    saladPanel.add(lite);
}

//ItemEvents and calls other functions
public void itemStateChanged(ItemEvent e)
{
    if (e.getSource() == standard || e.getSource() == deluxe) { 
        handleDinnerType((Checkbox)e.getSource());
    } else if (e.getSource() == soup || e.getSource() == salad) { 
        handleSoupSaladChoice((Checkbox)e.getSource());
    }    
}    

//helper function for dinner type
void handleDinnerType(Checkbox selectedType) 
{
    boolean enabled = false;

    if (selectedType == standard) {
        enabled = false;    
    } else if (selectedType == deluxe) {
        enabled = true;
    }

    cream.setEnabled(enabled);
    broth.setEnabled(enabled);
    gumbo.setEnabled(enabled);
    tossed.setEnabled(enabled);
    caesar.setEnabled(enabled);
    croutons.setEnabled(enabled);
    lite.setEnabled(enabled);

}

//helper function for salad and soup type
void handleSoupSaladChoice(Checkbox selectedCourse) 
{
    boolean soupEnabled, saladEnabled;

    if (selectedCourse == soup) {
        soupEnabled = true;
        saladEnabled = false;
    } else {
        soupEnabled = false;
        saladEnabled = true;
    }

    cream.setEnabled(soupEnabled);
    broth.setEnabled(soupEnabled);
    gumbo.setEnabled(soupEnabled);

    tossed.setEnabled(saladEnabled);
    caesar.setEnabled(saladEnabled);
    croutons.setEnabled(saladEnabled);
    lite.setEnabled(saladEnabled);
}
}     
4

1 回答 1

1

您要询问的行为是半复选框和半单选按钮,有两种方法可以解决它:

  1. 在 Checkboxgroup 中添加一个额外的 Checkbox,它基本上说“没有其他选项”。并在您的侦听器中设置该复选框的状态。因为一旦您在复选框组中选择了一个选项,您就无法清除它,我相信。

  2. 删除 Checkboxgroup 并让您的侦听器管理其他复选框的排除,而不是依赖 Checkboxgroup。示例代码是

-

public class Applet_15934232 extends Applet implements ItemListener {
    Panel
            dinnerPanel,
            soupPanel,
            saladPanel;

    Checkbox
            standard, deluxe,
            soup, salad,
            cream, broth, gumbo,
            tossed, caesar,
            croutons, lite;

    //Used to setup all of the boxes and add them to the Applet
    public void init() {
        CheckboxGroup dinnerType = new CheckboxGroup();
        standard = new Checkbox("standard", dinnerType, false);
        standard.addItemListener(this);
        deluxe = new Checkbox("deluxe", dinnerType, true);
        deluxe.addItemListener(this);

        CheckboxGroup soupOrSalad = new CheckboxGroup();
        soup = new Checkbox("Soup", soupOrSalad, false);
        soup.addItemListener(this);
        salad = new Checkbox("Salad", soupOrSalad, false);
        salad.addItemListener(this);

        cream = new Checkbox("cream", false);
        cream.addItemListener(this);
        broth = new Checkbox("broth", false);
        broth.addItemListener(this);
        gumbo = new Checkbox("gumbo", false);
        gumbo.addItemListener(this);

        tossed = new Checkbox("tossed", false);
        tossed.addItemListener(this);
        caesar = new Checkbox("ceasar", false);
        caesar.addItemListener(this);
        croutons = new Checkbox("croutons", false);
        croutons.addItemListener(this);
        lite = new Checkbox("lite", false);
        lite.addItemListener(this);


        //adding the componets to the Applet
        setLayout(new GridLayout(0, 1));

        dinnerPanel = new Panel();
        add(dinnerPanel);
        dinnerPanel.add(standard);
        dinnerPanel.add(deluxe);

        soupPanel = new Panel();
        add(soupPanel);
        soupPanel.add(soup);
        soupPanel.add(cream);
        soupPanel.add(broth);
        soupPanel.add(gumbo);

        saladPanel = new Panel();
        add(saladPanel);
        saladPanel.add(salad);
        saladPanel.add(tossed);
        saladPanel.add(caesar);
        saladPanel.add(croutons);
        saladPanel.add(lite);
    }

    //ItemEvents and calls other functions
    public void itemStateChanged(ItemEvent e) {
        if (e.getSource() == standard || e.getSource() == deluxe) {
            handleDinnerType((Checkbox) e.getSource());
        } else if (e.getSource() == soup || e.getSource() == salad) {
            handleSoupSaladChoice((Checkbox) e.getSource());
        } else {
            handleButtonSelection((Checkbox) e.getSource());
        }
    }

    private void handleButtonSelection(Checkbox source) {
        cream.setState(source == cream);
        broth.setState(source == broth);
        gumbo.setState(source == gumbo);
        tossed.setState(source == tossed);
        caesar.setState(source == caesar);
        croutons.setState(source == croutons);
        lite.setState(source == lite);
    }

    //helper function for dinner type
    void handleDinnerType(Checkbox selectedType) {
        boolean enabled = false;

        if (selectedType == standard) {
            enabled = false;
        } else if (selectedType == deluxe) {
            enabled = true;
        }

        cream.setEnabled(enabled);
        broth.setEnabled(enabled);
        gumbo.setEnabled(enabled);
        tossed.setEnabled(enabled);
        caesar.setEnabled(enabled);
        croutons.setEnabled(enabled);
        lite.setEnabled(enabled);

    }

    //helper function for salad and soup type
    void handleSoupSaladChoice(Checkbox selectedCourse) {
        boolean soupEnabled = (selectedCourse == soup);
        boolean saladEnabled = (selectedCourse == salad);

        if (soupEnabled) {
            tossed.setState(false);
            caesar.setState(false);
            croutons.setState(false);
            lite.setState(false);
        }
        if (saladEnabled) {
            cream.setState(false);
            broth.setState(false);
            gumbo.setState(false);
        }


        cream.setEnabled(soupEnabled);
        broth.setEnabled(soupEnabled);
        gumbo.setEnabled(soupEnabled);

        tossed.setEnabled(saladEnabled);
        caesar.setEnabled(saladEnabled);
        croutons.setEnabled(saladEnabled);
        lite.setEnabled(saladEnabled);
    }
}  
于 2013-09-14T07:32:24.417 回答