我在JAVA中总结了3个不同的值时遇到了麻烦。 我使用Swing,有3种不同的组合框。对于每个组合框中的每个选定项,事件侦听器应返回不同的值。 E.G。:我有一个带有不同饮料的组合盒(每个都有价格),另一个有不同的食物(再次,每个都有价格)。 像这样的东西:
EDITED:对于每个组合框,我得到了一系列包含不同项目(食品和饮料)的字符串。
例如:
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()
,就像你们中的一些人说的那样,是正确的。
有人能帮助我吗?
答案 0 :(得分:2)
像@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;
}
}
}
答案 1 :(得分:0)
每次调用一个侦听器时,都应调用一个方法来检查每个ComboBox上的选择并返回所选项目的总价。
答案 2 :(得分:0)
你可以做两件事:
首先,您将使用JComboBox.getSelectedIndex(),而不是getItemCount()。
另一种可能性就是创建一个有两个变量的类 - 食品/饮料的名称和价格。您添加
public String toString() { }
该类的方法将返回食物/饮料的名称,以及常规的吸气剂和制定者。您可以使用这些对象填充组合框。当你最终调用getSelectedItem()时,因为你已经获得了价格已经存在的对象,你可以调用你的getPrice()方法,而不是用固定价格硬编码case语句 - 这通常是一个坏主意
答案 3 :(得分:0)
以下是Swings组合框的文档。 http://docs.oracle.com/javase/tutorial/uiswing/components/combobox.html。您确定在事件发生时,通过打印语句或任何其他方式触发您的方法吗?
如果你的方法不起作用,我会从ActionListener创建处理事件实现的类,然后创建一个ActionPerformed方法。您可以通过检查ActionPerformed中的源来决定该怎么做。
getItemCount()存在问题,看起来它将返回组合框所使用的数组中的元素数。您需要在组合框上调用getSelectedItem()来获取已检查的项目。
另一个潜在的问题是你的switch语句,它们没有任何默认值。如果为comboxbox设置初始值,则可能不会出现问题。
我也认为你不能从ActionPerformed方法返回一个值。我可能错了,但我几乎肯定,当你的事件发生时,系统会为你调用。这意味着没有变量来填充返回的价格。您总是可以使用全局变量。
总之,如果你按照上面的链接我认为“使用不可编辑的组合框”和“处理组合框上的事件”部分将是最有用的。