※ ChatGPTを利用し、要約された質問です(原文:【Swing】JPanel クラス外からのremoveについて)
【Swing】JPanel クラス外からのremoveについて
このQ&Aのポイント
_tonnuraと申します。どうぞよろしくお願いします。
現在、初期画面(Menu.java)、イベント(ButtonClicked.java)、パネル設定(Mondai.java)の3つを使用して、画面を切り替えようとしています。
内部で「add」「remove」する分には問題ないのですが、一旦外にでてしまうと、配列でしか「remove」できない状態です。画面によってはループを考えていますので、必要な部分だけ追記したいのです。配列での指定ですと応用が辛いので・・。ソースが無駄に長いため概念的な部分だけ抜き出しています。
【Swing】JPanel クラス外からのremoveについて
_tonnuraと申します。どうぞよろしくお願いします。
現在、
・初期画面(Menu.java)
・イベント(ButtonClicked.java)
・パネル設定(Mondai.java)
の3つを使用して、画面を切り替えようとしています。(パネルを載せていく形です)
「Class Mondai」にて定義したパネル(p10)の部品を、フレームに載せる前にいじりたいと思っていますが、「☆」の部分で困っています。
内部で「add」「remove」する分には問題ないのですが、一旦外にでてしまうと、配列でしか「remove」できない状態です。
上記の挙動から、戻り値的には「ButtonClicked」上でコンテナ(p10)が見えていると思うのですが、配列以外(名前やID等、処理のたびに変動しないもの)で指定することはできないのでしょうか。
画面によってはループを考えていますので、必要な部分だけ追記したいのです。配列での指定ですと応用が辛いので・・。
尚、ソースが無駄に長いため 概念的な部分だけ抜き出しています。
「そもそも」な部分が多々あると思いますが、なにとぞよろしくお願いします。
■Class Menu
package test;
//フレームの定義
public class Menu extends JFrame{
public static void main(String[] args) {
Menu frame_m = new Menu();
frame_m.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame_m.setTitle("画面遷移テスト");
frame_m.setBounds(10, 10, 750, 570);
frame_m.setVisible(true);
frame_m.setResizable(false);
}
Menu() {
~(省略)初期画面のパネル・部品・レイアウトに関する宣言~
panel_menu.add(t_label);
getContentPane().add(panel_menu);
validate();
}
■Class ButtonClicked
package test;
Class ButtonClicked implemments ActionListener{
//フレームを格納 パネル作成時の設置先として使用
public Menu owner;
//パネルを格納 前パネルの削除先として使用(getContentPane)
public Container subowner;
public void actionPerformed(ActionEvent ae) {
String cmd = ae.getActionCommand();
if (cmd.equals("btn_01")) {
//遷移画面の描写(パネルを被せる)
Mondai obj = new Mondai();
Container p10 = obj.drawPanel(owner);
//Class Mondaiにて定義したパネル上のコンポーネントJButton3)を削除したい
☆問題の部分です(ERROR:「JButton3を解決できません」)
// p10.remove(JButton3);
☆こっちだとOK (varidate後、表示されていない)
p10.remove(3);//owner.list(System.out)参照
owner.add(p10);
owner.validate();
} else if (cmd.equals("btn_b02")) {
//別の処理hogehoge
}
}
■Class Mondai
package test;
public Container drawPanel(Menu frame)throws Exception {
JPanel p10 = new JPanel();
~(省略)遷移画面のパネル・部品・レイアウトに関する宣言~
p10.add(JButton1);
p10.add(JButton2);
p10.add(JButton3);
return p10;
}
お礼
soramame99 様 回答していただきありがとうございます。 既存画面における、既存部品に対しての属性の変更(イベント)を行う目的でしたが、どうやって指定すればいいのか・・と悩んでいました。 ※1・2個の部品のためにパネルの無し張りなおしはやりすぎかな?と >(getComponents()でComponentの配列を取得し、各 Component の >Class や label値、name 値などを使って、対象を特定すれば良いでしょ >う。) 説明いただいた部分の「name値」という記述のおかげで 問題を解決することができました。 ※恥ずかしながら、setNameという概念がそもそもありませんでした。部品の定義時(new)にて、自動で付いているものだと・・・ 具体的には配列を取得し、For文にて回しながら「name値」を元に判定をさせることで、コンポーネントを特定することができました。 ※「コンテナ.remove(コンポーネント情報「何か」);」 の1行で指定ができるものと勘違いしていました お忙しい中、ソースまで書いていただきありがとうございます。 考え方として勉強になりました。トータルのボタン数が多いのでメソッド分けを検討しようと思います。 どうもありがとうございました!