如何在ActionEvent中区分多个组合框

时间:2012-04-26 10:37:59

标签: java swing user-interface jcombobox actionlistener

我有两个类,一个包含两个组合框的gui类和一个侦听两个组合框的监听器类。该软件是关于比萨饼的,组合框是选择比萨饼类型和数量,我会发布相关代码。

(gui class)
private Listener listen = new Listener();
private JComboBox chooseItem = new JComboBox();
private JComboBox quantity = new JComboBox();
private String[] selection = {"Choose a Pizza","Margherita", "Pepperoni", "Four Seasons", "Chips", "Garlic Bread", "Potato Wedges", "Cocacola", "Orange Juice", "Lemonade"};
private String[] qSelection = {"0","1","2","3","4","5","6","7","8","9","10"};

private void comboBoxs() {
 choosePizza = new JComboBox(selection);
    chooseItem.setSelectedIndex(0);
    panel.add(choosePizza);
    choosPizza.addActionListener(listener);

 quantity = new JComboBox(qSelection);
    quantity.setSelectedIndex(0);
    panel.add(quantity);
    quantity.addActionListener(listener);
}

在听众课程中,我陷入困境,至今尚无法找到解决方案。我必须使用ActionListener,但我不确定我是如何区分这两个组合框的。

(listener class)

public void actionPerformed(ActionEvent event) {

   if (actionCommand.equals("Confirm")) {
          String q = new String();
          String d = new String();
            d = description;
            q = quantity;
    }

 else {
        JComboBox cbq = (JComboBox)event.getSource();
        String itemNumber = (String)cbq.getSelectedItem();
        getQuantity(itemNumber);

        JComboBox cb = (JComboBox)event.getSource();
        String name = (String)cb.getSelectedItem();
        getItemName(name);
   }
 }

  public String getItemName(String name) {
        description = new String();
        description = name;
        return name;
  }

  public String getQuantity(String itemNumber){
        quantity = new String();
        quantity = itemNumber;
        return itemNumber;
 }

因此,总结一下:当我在两个JComboBox中选择值时,我希望能够将所选的chooseItem JComboBox项存储在“description”字符串中,并将所选数量的JComboBox项存储在“quantity”字符串中。

目前,chooseItem JComboBox所选项目显示为两个值,并且数量根本不显示。 (这实际上是在上次出现在描述字符串中使用的任何一个框以及指向null的数量之前的进展。)

我在网上找到的所有例子都只涉及一个带有单个JComboBox的ActionListener,我一直试图让它工作几个小时但没有运气,我完全陷入困境。

3 个答案:

答案 0 :(得分:3)

你要么为每个组合框附加一个单独的监听器,所以你的监听器知道它接收的事件来自那个特定的组合框。

另一个解决方案是让侦听器访问这些组合框(通过在类中公开它们,或者将它们作为参数传递给侦听器的构造函数),并将事件源与这些组合框进行比较以确定哪个组合框引起了这一事件。

就个人而言,我更喜欢在听众和我的组件之间进行一对一的映射,以避免出现这些并发症。

小方注:你发布的代码中有一些奇怪的东西

  • public void getQuantity(String itemNumber)void与您实际返回的内容发生冲突 - >不会编译
  • 在你的听众中,你要求事件两次来源并将其投射到两个不同的组合框中。这当然是不正确的

    JComboBox cbq = (JComboBox)event.getSource();
    String itemNumber = (String)cbq.getSelectedItem();
    getQuantity(itemNumber);
    
    //this returns the same combobox as above, so probably incorrect behavior
    JComboBox cb = (JComboBox)event.getSource();
    String name = (String)cb.getSelectedItem();
    getItemName(name);
    

答案 1 :(得分:2)

在您的控制器类中,您可以使用以下方法测试源的来源:

if(e.getSource() == gui.chooseItem){

}
else if(e.getSource() == gui.quantity){

}

当然,这意味着您在听众课程中提供了gui的参考,并将quantitychooseItem组合框设置为公开。

你也可以使用actionCommand,我觉得它更干净:

在gui:

chooseItem.setActionCommand("itemCB");
quantity.setActionCommand("quantityCB");

在监听器类中:

if(e.getActionCommand().equals("itemCB")){
}
else if(e.getActionCommand().equals("quantityCB")){
}

答案 2 :(得分:1)

在这种情况下,我通常只为每个组合框创建一个匿名的ActionListener。类似的东西:

String foo;
String bar;

JComboBox fooBox = new JComboBox();
JComboBox barBox = new JComboBox();

fooBox.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent event) {
        foo = "Updated";
    }
});

barBox.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent event) {
        bar = "Updated";
    }
});

等等。