【问题标题】:How to differentiate between multiple combobox's in an ActionEvent如何区分 ActionEvent 中的多个组合框
【发布时间】:2012-05-07 02:03:41
【问题描述】:

我有两个类,一个包含两个组合框的 gui 类和一个侦听两个组合框的侦听器类。软件是关于pizza的,combobox是选择pizza种类和数量的,我贴出相关代码。

(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,我一直试图让它工作几个小时但没有运气,我完全陷入困境。

【问题讨论】:

  • “我会贴出相关代码。”为了尽快获得更好的帮助,发SSCCE

标签: java swing user-interface jcombobox actionlistener


【解决方案1】:

您可以为每个组合框附加一个单独的侦听器,以便您的侦听器知道它接收到的事件来自该特定的组合框。

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

就我个人而言,我更喜欢在我的侦听器和我的组件之间进行一对一的映射,以避免这种复杂性。

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

  • 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);
    

【讨论】:

  • getQuantity 方法错误只是写错了问题,我会更正:) 我认为附加一个单独的侦听器是我正在寻找的,但我不确定如何实现这……
  • 您现在拥有choosPizza.addActionListener(listener)quantity.addActionListener(listener)。只需在此处添加两个单独的侦听器
【解决方案2】:

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

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

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

}

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

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

在图形界面中:

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

在监听类中:

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

【讨论】:

  • 干杯,这对我也有很大帮助!
【解决方案3】:

在这种情况下,我通常只为每个组合框创建一个匿名 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";
    }
});

等等。

【讨论】:

  • 我发现的问题是我无法在我的监听器类中创建一个 gui 实例,因为我已经在 gui 中有一个监听器类的实例,它为我创建了一个无限循环。所以这意味着我必须在我的侦听器类中添加动作侦听器并将它作为我的侦听器类作为参数,即'chooseItem.addActionListener(listener);'然后我在我的监听器类中执行 actionlistener。我不知道如何在一个类中完成所有操作,但仍将信息传递给侦听器类,而无需在其中创建 gui 实例。我可能在那里没有意义
  • 对不起,我不太明白你在说什么。如果您担心访问匿名类之外的属性,您应该知道这些都可以从匿名类中获得。
  • 我设法理清了我的困惑,你的回答让我以一种我弄清楚我必须做什么的方式质疑我的代码。所以谢谢你:)
猜你喜欢
  • 2014-11-26
  • 1970-01-01
  • 2019-11-06
  • 2021-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-25
  • 1970-01-01
相关资源
最近更新 更多