【问题标题】:How to sum values returned by 3 different methods?如何对 3 种不同方法返回的值求和?
【发布时间】:2014-08-22 16:20:36
【问题描述】:

我无法在 JAVA 中总结 3 个不同的值。 我正在使用 Swing,并且有 3 个不同的组合框。对于每个组合框中的每个选定项,事件侦听器应返回不同的值。 例如:我有一个组合框,里面有不同的饮料(每种都有价格),另一种有不同的食物(同样,每种都有价格)。 像这样:

已编辑:对于每个 Combo-box,我得到了一个包含不同项目(食物和饮料)的字符串数组。

例如:

jCbeverages = new javax.swing.JComboBox();

jCbeverages.setModel(new javax.swing.DefaultComboBoxModel(new String[] {

    "Expresso- R$3.80",
    "Latte- R$6.80",
    "Cappuccino- R$6.80",

}));

jCbeverages.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
        jCbebidasActionPerformed(evt);
    }
});

getContentPane().add(jCbeverages);
jCbeverages.setBounds(40, 340, 300, 20);

上面的事件监听器是:

  public double jCbeveragesActionPerformed(java.awt.event.ActionEvent evt){                                          
     int beverage= jCbeverage.getSelectedIndex();
     double priceBev= 0;
     switch (beverage){
        case (0):
           priceBev=3.80;
           break;
        case (1):
           priceBev=4.60;
           break;
        case (2):
           priceBev=4.60;
           break;
     }
     return priceBev;
  }

食物也是如此

  public double jCfoodsActionPerformed(java.awt.event.ActionEvent evt) {                                           
     int food = jCfoods.getSelectedIndex();
     double priceFood=0;
     switch (food){
        case (0):
           priceFood=3.00;
           break;
        case (1):
           priceFood=4.00;
           break;
        case (2):
           priceFood=4.00;
           break;
     }
     return priceFood;  
  }

我需要显示总价,即priceBev+priceFood

但我已经尝试了很多东西,但我做不到。我认为问题出在范围上,但我所有的方法都是public 所以,我认为问题不在于那个。 **注意:**对不起,我输入了 getItemCount() 但这是一个错误,我的代码部分有误。 getSelectedIndex(),就像你们中的一些人说的那样,是正确的。 有人可以帮帮我吗?

【问题讨论】:

  • 好吧,打电话给getItemCount() 不会给你选择的食物或饮料。
  • 实际上,它给了。我已经通过在控制台中打印每个值来测试它,它可以工作。问题在于总和
  • 您可以answer your own question,也可以通过单击答案左侧的empty check mark 来接受现有答案。

标签: java swing methods sum return


【解决方案1】:

就像@ortis 和@mbw 说你应该这样做:

public class JavaApplication2 {

    private static JComboBox c1;
    private static JComboBox c2;
    private static JLabel sumLabel = new JLabel("0");

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        final JFrame f = new JFrame("Sum Combobox");


        Food f1 = new Food("F1", 100);
        Food f2 = new Food("F2", 20);
        c1 = new JComboBox(new Food[] {f1, f2});

        Beverage b1 = new Beverage("B1", 30);
        Beverage b2 = new Beverage("B2", 90);
        c2 = new JComboBox(new Beverage[] {b1, b2});

        c1.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent e) {
                sumLabel.setText(String.valueOf(calculateSum()));
                f.repaint();
            }
        });

        c2.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent e) {
                sumLabel.setText(String.valueOf(calculateSum()));
                f.repaint();
            }
        });

        JPanel p = new JPanel();
        p.add(c1);
        p.add(c2);
        p.add(sumLabel);

        f.add(p);
        f.pack();
        f.setVisible(true);
    }

    static int calculateSum() {
        Food selectedFood = (Food) c1.getSelectedItem();
        Beverage selectedBeverage = (Beverage) c2.getSelectedItem();
        return selectedFood.price + selectedBeverage.price;
    }

    static class Food {
        String name;
        int price;

        Food(String name, int price) {
            this.name = name;
            this.price = price;
        }

        @Override
        public String toString() {
            return name;
        }
    }

    static class Beverage {
        String name;
        int price;

        Beverage(String name, int price) {
            this.name = name;
            this.price = price;
        }

        @Override
        public String toString() {
            return name;
        }
    }
}

【讨论】:

  • 谢谢,我去看看。
【解决方案2】:

每次调用您的侦听器时,您应该调用一个方法来检查每个 ComboBox 上的选择并返回这些选定项目的总价格。

【讨论】:

    【解决方案3】:

    你可以做两件事:

    首先,您将使用 JComboBox.getSelectedIndex(),而不是 getItemCount()。

    另一种可能性是创建一个具有两个变量的类——食物/饮料的名称和价格。你会添加一个

    public String toString() { }
    

    返回食品/饮料名称的类的方法,以及常规的 getter 和 setter。您将使用这些对象填充您的组合框。当你最终调用 getSelectedItem() 时,因为你得到了一个已经包含价格的对象,你可以只调用你的 getPrice() 方法,而不是用固定价格硬编码 case 语句——这通常是个坏主意。

    【讨论】:

    • 我仍然看不到 getItemCount() 是如何正常工作的。我也不喜欢带有价格的硬编码案例陈述。它适用于分配,但如果您曾经在现实世界中编码,您将讨厌每次价格变化时都必须更新代码。
    • 其实我打错了 XD 确实是getSelectedIndex()。这是一个大学项目,我还不是专业人士,我只是在学习:)
    【解决方案4】:

    这是关于 Swings 组合框的文档。 http://docs.oracle.com/javase/tutorial/uiswing/components/combobox.html。您确定当事件发生时您的方法正在触发,无论是通过打印语句还是任何其他方式?

    如果您的方法不起作用,我会让处理事件的类从 ActionListener 实现,然后创建一个 ActionPerformed 方法。您可以通过检查 ActionPerformed 中的源来决定从那里开始做什么。

    getItemCount() 有一个问题,看起来它将返回组合框正在使用的数组中的元素数。您需要在组合框上调用 getSelectedItem() 来获取选中的项目。

    另一个潜在问题是您的 switch 语句,它们没有任何默认值。如果您为组合框设置初始值,这可能不是问题。

    我也不认为您可以从 ActionPerformed 方法返回值。我可能是错的,但我几乎肯定系统会在您的事件发生时为您调用。这意味着没有变量可以填充返回的价格。您总是可以使用全局变量。

    总之,如果您点击上面的链接,我认为“使用不可编辑的组合框”和“处理组合框上的事件”部分将是最有用的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-13
      • 2020-01-29
      • 2016-01-28
      • 1970-01-01
      • 2021-06-29
      • 1970-01-01
      • 2014-04-21
      • 1970-01-01
      相关资源
      最近更新 更多