【问题标题】:Java techniques for performing action only once on selected radio button仅对选定单选按钮执行一次操作的 Java 技术
【发布时间】:2014-07-22 21:10:04
【问题描述】:

我正在为一个班级制作一个 Java 小程序,我们正在使用单选按钮来为账单计算器选择交付或执行。交付选项需要付费,但执行不收费。我正在尝试编写只添加一次运费的代码,而不管点击交付按钮多少次。

如下图,每点击一次发货单选按钮,就收取一次费用,每点击一次结转,就扣除一次送货费的金额。有什么想法可以确保只收取一次交付费用或根本不收取费用吗?

// Create a panel to hold two radio buttons 
JPanel jrbOptions = new JPanel(new GridLayout(2 , 1));
jrbOptions.add(jrbPickUp = new JRadioButton("Pick Up - free"));
jrbOptions.add(jrbDelivery = new JRadioButton("Delivery - $4.00"));
jrbPickUp.setSelected(true);
add(jrbOptions, BorderLayout.WEST); 

//Create a radio button group to group two buttons
ButtonGroup group1 = new ButtonGroup();
group1.add(jrbPickUp);
group1.add(jrbDelivery);

jrbDelivery.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        if (jrbDelivery.isSelected()) {
            totalPrice += deliveryFee;  
            total.setText(String.valueOf(totalPrice));
        }
    }
});

jrbPickUp.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        if (jrbPickUp.isSelected()) {
            totalPrice -= deliveryFee;  
            total.setText(String.valueOf(totalPrice));
        }
    }
});

【问题讨论】:

    标签: java radio-button


    【解决方案1】:

    您需要一个可以在触发jrbDeliveryActionListener 时设置的标志,例如...

    // instance field...
    private boolean feeApplied = false;
    
    //...
    
    jrbDelivery.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (jrbDelivery.isSelected() && !feeApplied) {
                feeApplied = true;
                totalPrice += deliveryFee;  
                total.setText(String.valueOf(totalPrice));
            }
        }
    });
    

    您也可以使用它来取消运费(当feeAppliedtrue 时)

    【讨论】:

    • 我做了一些进一步的研究,使用 addItemListener 怎么样?如果单选按钮被选中,则添加运费,如果它变为未选中,则删除费用。
    • 它似乎可以满足我的需要,在这种情况下这是一项非常小的任务。这是经常使用的东西,还是 if 语句更常见?
    • 根据您所说的,这似乎是一个合适的解决方案。您监视JRadioButton 的状态变化并根据按钮状态更改模型的状态
    【解决方案2】:

    您应该有一个与 UI 分离的干净数据模型。送货费应该是一个单独的字段。然后您可以通过修改数据模型简单地启用/禁用费用:

    这是数据模型,应该在一个单独的类中(例如 ShoppingCart):

    public class ShoppingCart {
        private double price;
        private double deliveryFee;
        // other fields (e.g. the list of ordered items)
    
        public double getTotalPrice() {
            return price + deliveryFee;
        }
    
        public void setDeliveryFee(double fee) {
            this.deliveryFee = fee;
        }
    
        // other getters/setters...
    }
    

    然后你可以在你的 UI 中使用它:

    private ShoppingCart cart;
    // ...
    
    jrbDelivery.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (jrbDelivery.isSelected()) {
                cart.setDeliveryFee(deliveryFee); // update model
                updateUI();
            }
        }
    });
    
    jrbPickUp.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (jrbPickUp.isSelected()) {
                cart.setDeliveryFee(0.0); // update model
                updateUI();
            }
        }
    });
    

    在方法updateUI:

    total.setText(formatter.format(cart.getTotalPrice()));
    // do other UI updates here too!
    

    在提交时,ShoppingCart 被移交给提交机制,然后可以从对象中检索数据并将其发送到排序系统。

    改进:考虑使您的数据模型 bean 能够发送有关更改的通知(事件)。然后,您可以挂钩侦听器以在更改时自动更新 UI!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2012-07-30
      • 2016-01-09
      相关资源
      最近更新 更多