
_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;
}
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;
}
soramame99 様
回答していただきありがとうございます。
既存画面における、既存部品に対しての属性の変更(イベント)を行う目的でしたが、どうやって指定すればいいのか・・と悩んでいました。
※1・2個の部品のためにパネルの無し張りなおしはやりすぎかな?と
>(getComponents()でComponentの配列を取得し、各 Component の
>Class や label値、name 値などを使って、対象を特定すれば良いでしょ
>う。)
説明いただいた部分の「name値」という記述のおかげで
問題を解決することができました。
※恥ずかしながら、setNameという概念がそもそもありませんでした。部品の定義時(new)にて、自動で付いているものだと・・・
具体的には配列を取得し、For文にて回しながら「name値」を元に判定をさせることで、コンポーネントを特定することができました。
※「コンテナ.remove(コンポーネント情報「何か」);」
の1行で指定ができるものと勘違いしていました
お忙しい中、ソースまで書いていただきありがとうございます。
考え方として勉強になりました。トータルのボタン数が多いのでメソッド分けを検討しようと思います。
どうもありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JFrameとJPanelの最大化について
-
KeyListenerの使い方について
-
画面を切り替えたい
-
JPanelの切り替えと再描画
-
オブジェクトの中のプロパティ...
-
JSPでDBからデータ読み込みブラ...
-
ループ処理の際、最後だけ","を...
-
ORA-01858: 数値を指定する箇所...
-
system.out.printが出力されない
-
行の途中から読み込む方法
-
IF関数でEmpty値を設定する方法。
-
System.err. printlnとSystem.o...
-
C# ListBoxのインデックスの値...
-
flush()とclose()について
-
配列で、値の入っている要素数...
-
JSPでImportエラーになります
-
hiddenの値が期待した値で取得...
-
n番目に大きな値を探索する
-
[Ljava.lang.Stringってなんですか
-
javascriptで文字列のsjis利用...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
java junit list同士の比較方法
-
javaで文字数制限するには?
-
JPanelの重ね方/OverlayLayout他
-
ArrayListの使い方について(初...
-
TextAreaでの文字の色
-
JPanelの切り替えと再描画
-
setPrefferedSizeとsetSize
-
JFrameとJPanelの最大化について
-
【Swing】JPanel クラス外から...
-
フレームを閉じれない
-
Buttonを押すと画像が表示され...
-
JDialogを閉じた時の処理
-
BMI測定を作ろうとしている...
-
Java-Swing TextAreaにスクロー...
-
ボールが勝手に動き困ってます。
-
Javaについて
-
エラーで式の開始が不正ですと...
-
KeyListenerの使い方について
-
Enterキーでボタンを押すにはど...
-
4択クイズでのランダム出題の...
おすすめ情報