![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
_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で質問しましょう!
似たような質問が見つかりました
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java java final 1 2022/06/10 22:49
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- HTML・CSS 書籍を見つつサイト造りの練習をしているのですが、見た目が一致しません 2 2022/11/28 15:00
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- Java javaのクラスの分け方について質問です。 APIの内部用と外部用でクラスを分けたいのですがインター 2 2022/04/26 16:06
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- 英語 ①普通名詞の所有格+②普通名詞で、①普通名詞に定冠詞の意味を付加したい場合の表現方法等について 23 2022/09/30 12:47
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
java junit list同士の比較方法
-
JavaでのSwingを使った簡易電卓...
-
VBAの繰り返し処理表記と複数の...
-
ボタンがマウスオーバーしない...
-
javaで文字数制限するには?
-
4択クイズでのランダム出題の...
-
コンパイルエラー <identifier...
-
setPrefferedSizeとsetSize
-
JPanelの重ね方/OverlayLayout他
-
JOptionPaneでのフォーカスのト...
-
JTable の 列幅を個別に設定す...
-
BMI測定を作ろうとしている...
-
JAppletでJBottunを使いつつKey...
-
JPanelの切り替えと再描画
-
KeyListenerの使い方について
-
JTableの列ヘッダ
-
C言語のポインターに関する警告
-
IF関数でEmpty値を設定する方法。
-
System.err. printlnとSystem.o...
-
オブジェクトの中のプロパティ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
java junit list同士の比較方法
-
javaで文字数制限するには?
-
JPanelの切り替えと再描画
-
連番をオブジェクト名の最後に...
-
JPanelの重ね方/OverlayLayout他
-
JavaのswingでCardLayoutの画面...
-
JavaでのSwingを使った簡易電卓...
-
ArrayListの使い方について(初...
-
4択クイズでのランダム出題の...
-
KeyListenerの使い方について
-
JDialogを閉じた時の処理
-
BMI測定を作ろうとしている...
-
TextAreaでの文字の色
-
EXECLの行を削除
-
Java-Swing TextAreaにスクロー...
-
setPrefferedSizeとsetSize
-
【Swing】JPanel クラス外から...
-
最後の行に移動するには?
-
あるコンボボックスを選択する...
-
JButton-背景の透明化
おすすめ情報