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
相关产品推荐
相关产品推荐

