dポイントプレゼントキャンペーン実施中!

_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;
}

A 回答 (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;
}
    • good
    • 1
この回答へのお礼

soramame99 様

回答していただきありがとうございます。

既存画面における、既存部品に対しての属性の変更(イベント)を行う目的でしたが、どうやって指定すればいいのか・・と悩んでいました。
※1・2個の部品のためにパネルの無し張りなおしはやりすぎかな?と

>(getComponents()でComponentの配列を取得し、各 Component の
>Class や label値、name 値などを使って、対象を特定すれば良いでしょ
>う。)

説明いただいた部分の「name値」という記述のおかげで
問題を解決することができました。
※恥ずかしながら、setNameという概念がそもそもありませんでした。部品の定義時(new)にて、自動で付いているものだと・・・

具体的には配列を取得し、For文にて回しながら「name値」を元に判定をさせることで、コンポーネントを特定することができました。
※「コンテナ.remove(コンポーネント情報「何か」);」
の1行で指定ができるものと勘違いしていました

お忙しい中、ソースまで書いていただきありがとうございます。
考え方として勉強になりました。トータルのボタン数が多いのでメソッド分けを検討しようと思います。

どうもありがとうございました!

お礼日時:2008/10/10 15:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!