0

2 つのコンボボックスを含む gui クラスと、2 つのコンボボックスをリッスンするリスナー クラスの 2 つのクラスがあります。ソフトウェアはピザに関するもので、コンボボックスはピザの種類と数量を選択するものです。関連するコードを投稿します。

(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 を使用する必要がありますが、2 つのコンボボックスをどのように区別するつもりなのかわかりません。

(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;
 }

要約すると、2 つの JComboBox で値を選択するときに、選択した chooseItem JComboBox アイテムを「説明」文字列に格納し、選択した数量 JComboBox アイテムを「数量」文字列に格納できるようにしたいと考えています。

現在、chooseItem JComboBox の選択項目は両方の値として表示され、数量はまったく表示されません。(これは実際には、最後に使用されたボックスが説明文字列に表示され、数量が null を指す前と同じように進行しています。)

私がオンラインで見つけることができたすべての例は、単一の JComboBox を持つ ActionListener のみを含みます。私はそれを何時間も機能させようとしましたが、運がなく、完全に立ち往生しています。

4

3 に答える 3

3

各コンボボックスに個別のリスナーをアタッチすると、リスナーは、受信したイベントがその特定のコンボボックスから発生したことを認識します。

もう 1 つの解決策は、リスナーにこれらのコンボボックスへのアクセス権を与え (クラスで公開するか、リスナーのコンストラクターにパラメーターとして渡すことにより)、イベントのソースをそれらのコンボボックスと比較して、どのコンボボックスが原因であるかを判断することです。行事。

個人的には、このような複雑さを避けるために、リスナーとコンポーネント間の 1 対 1 のマッピングを好みます。

ちょっとした補足:投稿したコードには奇妙なことがいくつかあります

  • public void getQuantity(String itemNumber):void実際に何かを返すという事実との競合 -> コンパイルされません
  • リスナーで、イベントのソースを 2 回要求し、それを 2 つの異なるコンボボックスにキャストします。これはもちろん間違っています

    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の参照を指定し、コンボボックスをパブリックに設定したことを意味しquantityますchooseItem

あなたも使うことができ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 に答える