0

私はかなりの数の JButton を動的に追加した JPanel を持っています。これらすべてが完璧に機能しています。後でプログラムを実行するときに、これらのボタンを参照して、ボタンのテキストを引き出す必要があります。それらを参照する方法を理解するのに苦労しています。

各ボタンを作成するときに、一意の名前を付けました。これがボタンを作成したコードだとしましょう:

public void createButton(Container parent, String btnName) {
   JButton btn = new JButton("xyz");
   btn.setName(btnName);
   btn.addActionListner(new ActionListner() {
      //code
   }
   parent.add(btn);
 }

別の方法では、実行時に変更された可能性があるため、ボタンのラベルを取得しようとしています。これらのボタンの配列を作成時に保持する必要がありますか? または、それらを直接参照できる方法はありますか?

これは私が取り組んでいたことですが、ばかげています。誰でも正しいアプローチを提案できますか?

public String getBtnLabel(String btnName) {
   JButton btn = (JButton) btnName;
   return btn.getText();
}

答えが、配列を作成してから反復処理するだけでよいというものであれば、それで問題ありません。他のオプションを探しているだけです。

4

4 に答える 4

3

を使用する必要があるMap<String, JButton>ため、動的ボタンを作成するときに、ある種のユニークな名前を付けます。

//somewhere at the top of your class
private final Map<String, JButton> myButtonMap = new HashMap<>();

public void createButton(Container parent, String btnName) {
   JButton btn = new JButton("xyz");
   btn.setName(btnName);
   btn.addActionListner(new ActionListner() {
      //code
   }
   parent.add(btn);
   myButtonMap.put(btnName, btn);
 }

そして、単にマップから取得します

public String getBtnLabel(String btnName) {       
   return myButtonMap.get(btnName).getText();
}

ボタンが定義されていない場合、これは明らかにNPEをスローします...
また、マップを使い終わったらマップから削除する必要があります。そうしないと、メモリリークが発生します...

于 2013-02-17T18:30:26.327 に答える
2

を使用することをお勧めしますMap< String, JButton >

作成時に、新しいボタンをその中に入れますbuttons.put( name, btn )

使用するイベントハンドラーでJButton btn = buttons.get( name )

于 2013-02-17T18:29:27.487 に答える
2

はい、ボタンへの参照を保持する必要があります。配列はオプションですが、配列は使いにくいため、List を使用することをお勧めします。

ボタンを含む JPanel への参照がある場合は、そこから取得できます。しかし、それはかなり面倒な可能性があります。

于 2013-02-17T18:30:29.747 に答える
2

ボタンのリストまたはそれらへの参照をマップに保持することをお勧めしますが、これを行うこともできます。

for (Component i : parent.getComponents()) {
    if (i.getName().equals(btnName)) {
         JButton b = (JButton) i;
         // do stuff..
    }
}

親コンポーネントを使用し、追加されたコンポーネントを反復処理します。

于 2013-02-17T18:31:43.410 に答える