You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swing中点击基础汉堡按钮后收藏汉堡JButton未禁用问题排查

问题描述

在该汉堡订单应用中,用户既可以自定义汉堡,也能选择3款热门汉堡直接加入订单。目前存在问题:自定义汉堡时仍可点击热门汉堡按钮,导致订单混乱。我们期望实现:点击BeefBurger、ChickenBurger或FishBurger按钮时,禁用热门汉堡按钮;添加完自定义汉堡后,重新启用这些按钮。尝试通过调用disableSpecials()方法设置按钮setEnabled(false),调用enableSpecials()恢复,但热门汉堡按钮始终未禁用,请问原因是什么?该如何修复?

代码(注释已翻译)
import javax.swing.*;

import se.umu.cs.apjava.maxdonalds.burger.AbstractFactory;
import se.umu.cs.apjava.maxdonalds.burger.FavBurger;

import java.awt.*;

public class MaxDonaldsGuiBuilder {

private JCheckBox withKetchupButton;
private JCheckBox withMayoButton;
private BurgerOrderModel burgerOrderModel;
private ButtonGroup burgerGroup;
private JCheckBox withAioliButton;
private JCheckBox withTomatoButton;
private JCheckBox withPicklesButton;
private JCheckBox withLettuceButton;
private JButton favBurger1;
private JButton favBurger2;
private JButton favBurger3;

void buildGui() {
    burgerOrderModel = new BurgerOrderModel();
    var frame=new JFrame("MaxDonalds");


    JTextArea textArea = new JTextArea();
    frame.add(new JScrollPane(textArea), BorderLayout.CENTER);
    JComponent burgerPanel = buildBurgerPanel();
    JComponent orderPanel = buildOrderPanel(textArea);
    JComponent additionsPanel = buildSaucesPanel();
    JComponent vegetablesPanel = buildVegetablesPanel();
    JComponent favoriteBurgerPanel = favBurgerPanel();
    var topPanel=new JPanel();
    topPanel.setMinimumSize(new Dimension(1000,50));
    topPanel.add(burgerPanel);
    topPanel.add(vegetablesPanel);
    topPanel.add(additionsPanel);
    topPanel.add(favoriteBurgerPanel);

    topPanel.add(orderPanel);
    frame.add(topPanel,BorderLayout.NORTH);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setMinimumSize(new Dimension(1000,400));
    frame.setVisible(true);
    favBurger1 = new JButton();
    favBurger2 = new JButton();
    favBurger3 = new JButton();


}

private JComponent buildOrderPanel(JTextArea textArea) {
    Box orderPanel=new Box(BoxLayout.Y_AXIS);
    var printButton = new JButton("Print Order");
    printButton.addActionListener(e->{
        String orderString= burgerOrderModel.getOrderString();
        textArea.append(orderString);

    });
    var addButton = new JButton("Add Burger To Order");
    addButton.addActionListener(e->{
        if (burgerGroup.getSelection() == null) {
            burgerOrderModel.setType("Beef");
        }
        burgerOrderModel.addBurgerToOrder();
        //重新启用热门汉堡按钮
        enableSpecials();
        clearSelection();
    });
    orderPanel.add(addButton);
    orderPanel.add(printButton);
    orderPanel.add(Box.createGlue());
    return orderPanel;
}

private JComponent buildSaucesPanel() {
    var additionsPanel=new Box(BoxLayout.Y_AXIS);
    JLabel additions = new JLabel("Sauces");
    additions.setAlignmentX(Component.LEFT_ALIGNMENT);
    additionsPanel.add(additions);
    withKetchupButton = new JCheckBox("Ketchup");
    withKetchupButton.setAlignmentX(Component.LEFT_ALIGNMENT);
    withKetchupButton.addChangeListener(e->
        burgerOrderModel.setWithKetchup(withKetchupButton.isSelected())
    );
    additionsPanel.add(withKetchupButton);
    withMayoButton = new JCheckBox("Mayo");
    withMayoButton.setAlignmentX(Component.LEFT_ALIGNMENT);
    withMayoButton.addChangeListener(e->
        burgerOrderModel.setWithMayo(withMayoButton.isSelected())
    );
    additionsPanel.add(withMayoButton);
    withAioliButton = new JCheckBox("Aioli");
    withAioliButton.setAlignmentX(Component.LEFT_ALIGNMENT);
    withAioliButton.addChangeListener(e->
        burgerOrderModel.setWithAioli(withAioliButton.isSelected())
    );
    additionsPanel.add(withAioliButton);
    JComponent withTextPanel = getTextPanel();
    additionsPanel.add(withTextPanel);
    additionsPanel.add(Box.createGlue());
    return additionsPanel;
}

private JComponent buildVegetablesPanel() {
    var additionsPanel=new Box(BoxLayout.Y_AXIS);
    JLabel additions = new JLabel("Vegetables");
    additions.setAlignmentX(Component.LEFT_ALIGNMENT);
    additionsPanel.add(additions);
    withLettuceButton = new JCheckBox("Lettuce");
    withLettuceButton.setAlignmentX(Component.LEFT_ALIGNMENT);
    withLettuceButton.addChangeListener(e->
        burgerOrderModel.setWithLettuce(withLettuceButton.isSelected())
    );
    additionsPanel.add(withLettuceButton);
    withTomatoButton = new JCheckBox("Tomato");
    withTomatoButton.setAlignmentX(Component.LEFT_ALIGNMENT);
    withTomatoButton.addChangeListener(e->
        burgerOrderModel.setWithTomato(withTomatoButton.isSelected())
    );
    additionsPanel.add(withTomatoButton);
    withPicklesButton = new JCheckBox("Pickles");
    withPicklesButton.setAlignmentX(Component.LEFT_ALIGNMENT);
    withPicklesButton.addChangeListener(e->
        burgerOrderModel.setWithPickles(withPicklesButton.isSelected())
    );
    additionsPanel.add(withPicklesButton);
    JComponent withTextPanel = getTextPanel();
    additionsPanel.add(withTextPanel);
    additionsPanel.add(Box.createGlue());
    return additionsPanel;
}

private JComponent getTextPanel() {
    FlowLayout layout = new FlowLayout(FlowLayout.LEFT);
    layout.setHgap(0);
    layout.setVgap(0);
    var withTextPanel=new JPanel(layout);
    withTextPanel.setAlignmentX(Component.LEFT_ALIGNMENT);

    return withTextPanel;
}

private JComponent buildBurgerPanel() {
    var burgerPanel=new Box(BoxLayout.Y_AXIS);
    var chickenBurgerButton=new JRadioButton("ChickenBurger");
    chickenBurgerButton.addActionListener(e->{
        burgerOrderModel.setType("Chicken");
        //点击牛肉、鸡肉或鱼肉汉堡选项时,禁用收藏汉堡按钮
        disableSpecials();
    });
    var beefBurgerButton=new JRadioButton("BeefBurger");
    beefBurgerButton.addActionListener(e->{
        burgerOrderModel.setType("Beef");
         disableSpecials();    
    });
    var fishBurgerButton = new JRadioButton("FishBurger");
    fishBurgerButton.addActionListener(e -> {
        burgerOrderModel.setType("Fish");
        disableSpecials();
    });
    burgerGroup = new ButtonGroup();
    burgerGroup.add(beefBurgerButton);
    burgerGroup.add(chickenBurgerButton);
    burgerGroup.add(fishBurgerButton);
    burgerPanel.add(new JLabel("Basic Burgers"));
    burgerPanel.add(beefBurgerButton);
    burgerPanel.add(chickenBurgerButton);
    burgerPanel.add(fishBurgerButton);
    return burgerPanel;
}

private void clearSelection() {
    withKetchupButton.setSelected(false);
    withMayoButton.setSelected(false);
    withAioliButton.setSelected(false);
    withTomatoButton.setSelected(false);
    withPicklesButton.setSelected(false);
    withLettuceButton.setSelected(false);
    burgerGroup.clearSelection();
}

private JComponent favBurgerPanel() 
{

    var favoriteBurgerPanel=new Box(BoxLayout.Y_AXIS);
    var favBurger1 = new JButton("Favorite Burger 1");
    favBurger1.addActionListener(e -> {
        burgerOrderModel.setType("special 1");
        burgerOrderModel.addBurgerToOrder();
        clearSelection();
    });
    var favBurger2 = new JButton("Favorite Burger 2");
    favBurger2.addActionListener(e -> {
        burgerOrderModel.setType("special 2");
        burgerOrderModel.addBurgerToOrder();
        clearSelection();
    });
    var favBurger3 = new JButton("Favorite Burger 3");
    favBurger3.addActionListener(e -> {
        burgerOrderModel.setType("special 3");
        burgerOrderModel.addBurgerToOrder();
        clearSelection();
    });

    favoriteBurgerPanel.add(new JLabel("Top Burgers"));
    favoriteBurgerPanel.add(favBurger1);
    favoriteBurgerPanel.add(favBurger2);
    favoriteBurgerPanel.add(favBurger3);
    return favoriteBurgerPanel;

}

private void enableSpecials()
{
    favBurger1.setEnabled(true);
    favBurger2.setEnabled(true);
    favBurger3.setEnabled(true);
}

private void disableSpecials()
{
    favBurger1.setEnabled(false);
    favBurger2.setEnabled(false);
    favBurger3.setEnabled(false);
}


}
问题原因与修复方案

原因

在favBurgerPanel()方法中,重新定义了局部变量favBurger1、favBurger2、favBurger3,覆盖了类的成员变量。disableSpecials()和enableSpecials()操作的是未添加到界面的成员变量,而非界面上显示的按钮,因此设置失效。

修复方案

1. 修改favBurgerPanel()方法

将局部变量的定义改为给成员变量赋值,去掉var关键字:

private JComponent favBurgerPanel() 
{
    var favoriteBurgerPanel=new Box(BoxLayout.Y_AXIS);
    favBurger1 = new JButton("Favorite Burger 1");
    favBurger1.addActionListener(e -> {
        burgerOrderModel.setType("special 1");
        burgerOrderModel.addBurgerToOrder();
        clearSelection();
    });
    favBurger2 = new JButton("Favorite Burger 2");
    favBurger2.addActionListener(e -> {
        burgerOrderModel.setType("special 2");
        burgerOrderModel.addBurgerToOrder();
        clearSelection();
    });
    favBurger3 = new JButton("Favorite Burger 3");
    favBurger3.addActionListener(e -> {
        burgerOrderModel.setType("special 3");
        burgerOrderModel.addBurgerToOrder();
        clearSelection();
    });

    favoriteBurgerPanel.add(new JLabel("Top Burgers"));
    favoriteBurgerPanel.add(favBurger1);
    favoriteBurgerPanel.add(favBurger2);
    favoriteBurgerPanel.add(favBurger3);
    return favoriteBurgerPanel;
}

2. 删除冗余初始化代码

删除buildGui()方法中最后三行对成员变量的空初始化:

// 删除以下代码
favBurger1 = new JButton();
favBurger2 = new JButton();
favBurger3 = new JButton();

内容的提问来源于stack exchange,提问作者user20895221

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 19:15:54