- ベストアンサー
【Swing】JPanel クラス外からのremoveについて
- _tonnuraと申します。どうぞよろしくお願いします。
- 現在、初期画面(Menu.java)、イベント(ButtonClicked.java)、パネル設定(Mondai.java)の3つを使用して、画面を切り替えようとしています。
- 内部で「add」「remove」する分には問題ないのですが、一旦外にでてしまうと、配列でしか「remove」できない状態です。画面によってはループを考えていますので、必要な部分だけ追記したいのです。配列での指定ですと応用が辛いので・・。ソースが無駄に長いため概念的な部分だけ抜き出しています。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
remove()で削除するには、Container内のindex値かComponent自身のインスタンスを指定する必要がありますね。質問のコードでは、JButton3(どこかで宣言した変数でしょうか?)が、何か不明だということで、エラーになっているようです。このコードの流れで解決しようとするなら、p10のComponent群を検索して、removeしたいComponent(JButton3)のインスタンスを探し出す方法が考えられます。(getComponents()でComponentの配列を取得し、各 Component の Class や label値、name 値などを使って、対象を特定すれば良いでしょう。) ただ、一度作ったパネルから、後から部品を取り除いて体裁を整えるというのは、いかにも不自然ですよね。 おそらく私なら、Mondai.drawPanel() に一つ引数を追加して、Panelの生成時に必要な部品のみを配置するようにすると思います。(フラグの意味付けとしては、各Buttonの有無を直接指定する方法と、パネルの種類とそれぞれに必要なButtonの種類の対応表を間に挟む方法があると思います。Java的な発想に従うなら、引数でスイッチするより、それぞれのPanelの種類ごとにdrawPanelXXXX(Menu frame)のような形でメソッドを分けるのがよいかもしれません。) ... (~) if (cmd.equals("btn_01")) { Mondai obj = new Mondai(); Container p10 = obj.drawPanel(owner, (Mondai.BUTTON1 | Mondai.BUTTON2)); owner.add(p10); owner.validate(); (~) ... public class Mondai { public static final int BUTTON1 = 1; public static final int BUTTON2 = 2; public static final int BUTTON3 = 4; ... public Container drawPanel(Menu frame, int buttons) throws Exception { (~) JPanel p10 = new JPanel(); (~) if ((buttons & BUTTON1) != 0) { p10.add(JButton1); } if ((buttons & BUTTON2) != 0) { p10.add(JButton2); } if ((buttons & BUTTON3) != 0) { p10.add(JButton3); } return p10; }
お礼
soramame99 様 回答していただきありがとうございます。 既存画面における、既存部品に対しての属性の変更(イベント)を行う目的でしたが、どうやって指定すればいいのか・・と悩んでいました。 ※1・2個の部品のためにパネルの無し張りなおしはやりすぎかな?と >(getComponents()でComponentの配列を取得し、各 Component の >Class や label値、name 値などを使って、対象を特定すれば良いでしょ >う。) 説明いただいた部分の「name値」という記述のおかげで 問題を解決することができました。 ※恥ずかしながら、setNameという概念がそもそもありませんでした。部品の定義時(new)にて、自動で付いているものだと・・・ 具体的には配列を取得し、For文にて回しながら「name値」を元に判定をさせることで、コンポーネントを特定することができました。 ※「コンテナ.remove(コンポーネント情報「何か」);」 の1行で指定ができるものと勘違いしていました お忙しい中、ソースまで書いていただきありがとうございます。 考え方として勉強になりました。トータルのボタン数が多いのでメソッド分けを検討しようと思います。 どうもありがとうございました!