2016-07-11 2 views
0

私の問題:私はオブジェクトの動的なリストを持っています(それは何エレクタが含まれるかわかりません)。私はそれぞれのボタンが必要であり、各ボタンはアイテムが選択されたことを「教えて」いる必要があります。私はチェックボックスやラジオボタンを使いたいとは思っていません(そして、それらがオブジェクトを格納/返すことができないことを知っている限り)。私の解決策は次のとおりです。JButtonをJButtonであるItemButtonにサブクラス化します私の商品を保管するフィールドがあります。このようにして、リスナーに添付されているリスナーでreturnItemメソッドを呼び出すだけで、選択したアイテムを使用できる状態にします。私のボタンのリストを生成ボタンプロパティの情報を取得するためにJButtonをサブクラス化する

class toolButton extends JButton { 
    toolButton(String name, int i) { 
     super(name); 
     this.index = i;  
    } 

    public int getSelectionIndex() { 
     return this.index; 
    } 

    private int index; 
} 

方法:

public void showItemList(ArrayList<Item> arrayList) { 
    for (int i = 0; i < arrayList.size(); i++) { 
     toolButton but = new toolButton(arrayList.get(i).getName()", i); //getName() returns the name of the Item to be displayed 
     this.add(but); 
     but.addMouseListener(new MouseAdapter() { 
      // Simple anonymous class for the listener 
      public void mousePressed(MouseEvent e) { 
       selected = but.getSelectionIndex(); //This sets the index number in the class that uses this method 
      } 
     }); 
    }  
} 

それは私が、少なくともやっている何のために、働く

これは内部クラスです。しかし、より良い方法があるかどうか疑問に思っていました。もしそれがalthogerに惑わされないならば、これは少なくとも受け入れられます。私は、この場合には大いに役立つかもしれないactionEventに対してgetSource()を使用するとは思わない。どれくらいの数があるのか​​わからないので、各ボタンのリスナーを実際に書くことはできません。

編集: 私がモデル化しようとしているのは、シンプルなディスペンサーです。ディスペンサーにはアイテムのコレクションがあります(それぞれに名前と価格があります)。ディスペンサクラスは、メソッド「バイ(アイテムアイテム)」を有する。だから私がしたいのは、ボタンをディスペンサー内の利用可能なアイテムそれぞれを表すようにすることです。ボタンが押されたとき、アイテムの参照がメソッドbuy(アイテム)に渡されるようにします(ボタンは呼び出す必要はありません買い(アイテム)メソッド自体)。 私はあなたが理解していると確信しているので、これはクラスの練習なので、要件を変更することはできません。

+0

1. JButtonの適切なイベントハンドラは通常、but.addActionListener(新しいアクション(...))のようにActionListenerになります。2.タイプ名は大文字の3から始める必要があります。あなたが解決策を書いている要件を記述することができました。私たちは、それらに取り組む適切な方法についてより良い助言を与えることができました。 – rexford

+0

あなたの解決策は問題ありません。これはデコレータパターンの実装です。 https://en.m.wikipedia.org/wiki/Decorator_pattern – Tinman

+0

@Tinmanあなたのご意見ありがとうございました、パターンをまだ勉強していない、私はそれについて読むでしょう! – Paul

答えて

1

のArrayList引数の項目名は、対応する項目のカテゴリを解決するのに十分ならば、あなたはのJButtonをサブクラス化する必要はありませんが、あるとして、それを使用することができます。

public void showItemList(ArrayList<Item> arrayList){ 
    for(int i = 0; i < arrayList.size(); i++){ 
     JButton but = new JButton(arrayList.get(i).getName()); 
     getContentPane().add(but); 
     but.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent event){ 
       String itemName = event.getActionCommand(); 
      } 
     }); 
    } 
} 

いくつかの注意:

  • JFrameをサブクラス化する場合は、直接ボタンを追加する代わりにcontentPaneを使用する必要があります(getContentPane.add(ボタン))。 JPanelを使用している場合は、コードは問題ありません。
  • あなたの場合、MouseListenerではなくActionListenerを使用する必要があります。追加された値として、クリックされたボタンのラベルevent.getActionCommand()が照会されます。これにより、選択された項目がわかり、インデックスを追跡するためのサブクラスを実装する必要がありません。
+0

私の場合は名前だけでは不十分です。私はあなたがイベントを使用していることに気づいた。getActionCommandを使用して項目の名前を取得しますが、but.setActionCommand(item.getName())を呼び出してActionCommandを項目の名前に設定したことはありません。つまり、ActionCommandは、setActionCommandの明示的な呼び出しがない場合、JButtonの名前をチェックするだけですか? (私はあなたが「クリックされたボタンのラベルを照会することになる」と思うが、確かめたい) – Paul

+0

JButtonがクリックされると、登録されたすべてのActionListenerに対してactionPerformed(ActionEvent)メソッドが呼び出されます。 ActionEvent引数には、event.getSource()を呼び出すことによって取得できるJButtonオブジェクト自体、button.getActionCommand()ボタンのラベルなど、イベントに関する情報が含まれます。このイベントオブジェクトはあなたのために作成され、event.setActionCommand(String)のように自分でプロパティを設定することはできません – rexford

+0

私のボタンのアクションコマンドを指定するsetActionCommand()を呼び出さないと、event.getActionCommand ()戻る? – Paul

関連する問題