質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

1550閲覧

パネルの追加、削除

nakamura-

総合スコア48

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/07/25 06:24

コード public class Part01 extends JApplet{ public void init(){ setSize(1000, 800); //アプレットサイズ設定 MainPanel mp = new MainPanel(); getContentPane().add(mp); } }
コード public class MainPanel extends JPanel{ /** * コンストラクタ */ public MainPanel(){ setBackground(Color.BLACK); //背景色設定 JLabel jl1 = new JLabel("おはよう"); add(jl1); } /** * キー入力処理 */ @Override public void processKeyEvent(KeyEvent ke){ /*何かキーが押された場合*/ if(ke.getID() == KeyEvent.KEY_PRESSED){ if(ke.getKeyCode() == KeyEvent.VK_SPACE){ /*MaijPanel削除する処理 BasePanel追加する処理*/ } } } /** * 描画処理 */ @Override public void paintComponent(Graphics g){ super.paintComponent(g); requestFocusInWindow(); //キー入力有効化 } }
コード public class BasePanel extends JPanel{ /** * コンストラクタ */ public BasePanel(){ setBackground(Color.RED); //背景色設定 JLabel jl2 = new JLabel("こんばんは"); add(jl2); } }

上のプログラムで
MainPanelがあってスペースキーを押すとMainPanelを取り除いてBasePanelを追加する
(「おはよう」表示から「こんばんは」表示に変える)
ということをしたいです。

コメントアウトしてる
/MaijPanel削除する処理
BasePanel追加する処理
/
この部分に記述したらいいと思うのですが何を書いたらいいのでしょうか?
addやremoveを使っても動かなかったのでよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

addやremoveを使っても動かなかったのでよろしくお願いします。

質問者さんが具体的にどういうことをやって上手く行かなかったかが分かると、
説明しやすくなります。
次回からは試したことも書いていただけるとありがたいです。

getParent()で自分の親を取得し、それに対して追加・削除をします。
最後に、コンポーネントツリーが変更されたので、すべて描画しなおすために
SwingUtilities.updateComponentTreeUI()を呼びます。

lang

1if (ke.getKeyCode() == KeyEvent.VK_SPACE) { 2 Container parent = getParent(); 3 parent.remove(this); // MainPanel自身を削除 4 parent.add(new BasePanel()); 5 SwingUtilities.updateComponentTreeUI(parent); 6}

それと、これは必須ではありませんが、
コンポーネントだけ使う場合は、paintComponentは不要ですし、
requestFocusInWindow()は、Part01init()に書いたほうが良いように思います。

lang

1 // Part01のinit()の最後に追加 2 mp.requestFocusInWindow();

投稿2016/07/25 09:56

argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nakamura-

2016/07/26 23:54

回答ありがとうございます。 すみません。 remove(this); add(bp); をしたのですができなっかたということです。 次回からは記載するようにします。 質問なのですが remove(this); add(bp); だけでも動作できるときのあると思うのですが、なぜ今回はgetParent()で自分の親を取得するという作業がいるのでしょうか? よろしければ回答お願いしたいです。 ご指摘ありがとうございます。 requestFocusInWindow()をinit()に移させていただきました。
argius

2016/07/27 00:15

> なぜ今回はgetParent()で自分の親を取得するという作業がいるのでしょうか? MainPanelはPart01の子になっていて、 今回キーイベントを処理しているのがMainPanelクラスの中なので、 そこから相対的にPart01(のContentPane)にアクセスするためにgetParent()をしています。
nakamura-

2016/08/01 08:37

回答ありがとうございます。 そういうことなんですね! ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問