0

我有两个类,一个包含两个组合框的 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 项目存储在“描述”字符串中,并将选定的数量 JComboBox 项目存储在“数量”字符串中。

目前,chooseItem JComboBox 所选项目显示为两个值,并且根本不显示数量。(这实际上是在描述字符串中最后出现的框和数量指向 null 之前的进度。)

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

4

3 回答 3

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);
    
于 2012-04-26T10:47:13.033 回答
2

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

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

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

}

当然,这意味着您在侦听器类中提供了您的 gui 参考,并将设置quantitychooseItem组合框设置为 public。

您也可以使用actionCommand,我认为它更干净:

在 gui 中:

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

在侦听器类中:

if(e.getActionCommand().equals("itemCB")){
}
else if(e.getActionCommand().equals("quantityCB")){
}
于 2012-04-26T11:01:59.870 回答
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";
    }
});

等等。

于 2012-04-26T11:08:25.623 回答