• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:【Swing】JPanel クラス外からのremoveについて)

【Swing】JPanel クラス外からのremoveについて

このQ&Aのポイント
  • _tonnuraと申します。どうぞよろしくお願いします。
  • 現在、初期画面(Menu.java)、イベント(ButtonClicked.java)、パネル設定(Mondai.java)の3つを使用して、画面を切り替えようとしています。
  • 内部で「add」「remove」する分には問題ないのですが、一旦外にでてしまうと、配列でしか「remove」できない状態です。画面によってはループを考えていますので、必要な部分だけ追記したいのです。配列での指定ですと応用が辛いので・・。ソースが無駄に長いため概念的な部分だけ抜き出しています。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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; }

_tonnura
質問者

お礼

soramame99 様 回答していただきありがとうございます。 既存画面における、既存部品に対しての属性の変更(イベント)を行う目的でしたが、どうやって指定すればいいのか・・と悩んでいました。 ※1・2個の部品のためにパネルの無し張りなおしはやりすぎかな?と >(getComponents()でComponentの配列を取得し、各 Component の >Class や label値、name 値などを使って、対象を特定すれば良いでしょ >う。) 説明いただいた部分の「name値」という記述のおかげで 問題を解決することができました。 ※恥ずかしながら、setNameという概念がそもそもありませんでした。部品の定義時(new)にて、自動で付いているものだと・・・ 具体的には配列を取得し、For文にて回しながら「name値」を元に判定をさせることで、コンポーネントを特定することができました。 ※「コンテナ.remove(コンポーネント情報「何か」);」 の1行で指定ができるものと勘違いしていました お忙しい中、ソースまで書いていただきありがとうございます。 考え方として勉強になりました。トータルのボタン数が多いのでメソッド分けを検討しようと思います。 どうもありがとうございました!