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

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

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

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Q&A

解決済

1回答

2980閲覧

Java Swing CardLayoutで画面遷移用のパネルが表示されない

Bamimimi

総合スコア1

Java

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

1グッド

0クリップ

投稿2021/06/17 01:13

前提・実現したいこと

Javaを勉強して1週間くらいになります。
Swingでじゃんけんをするゲームを作っています。
CardLayoutを使い4つのパネルを遷移できるようにCardLayoutを試していますが
うまくいきません。

何がいけないのかお分かりになる方がいらっしゃいましたらご教授いただけますと幸いです。

発生している問題・エラーメッセージ

作ったフレームに追加したパネルが表示されません

該当のソースコード

Java

1package sample; 2 3import java.awt.CardLayout; 4import java.awt.Color; 5 6import javax.swing.JButton; 7import javax.swing.JFrame; 8import javax.swing.JPanel; 9import javax.swing.WindowConstants; 10 11public class sample_mn extends JFrame{ 12 13 JPanel GamePanel; 14 CardLayout layout; 15 16 public static void main(String[] args) { 17 18 sample_setting sett = new sample_setting(); 19 20 //swingフレームを作る 21 JFrame Mainfr = new JFrame(); 22 Mainfr.setTitle("じゃんけん"); //フレームタイトル 23 Mainfr.setSize(400, 350); //フレームサイズ 24 Mainfr.getContentPane().setBackground(Color.white); 25 Mainfr.setLocationRelativeTo(null); //フレームを画面中央に配置 26 Mainfr.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //ウインドウを×で閉じる 27 28 //フレーム設置 29 Mainfr.setVisible(true); 30 31 } 32 33 sample_mn(){ 34 //デフォルトコンストラクタ 35 //画面遷移用のパネルを作成する 36 37 //Game1 オープニング画面 真っ黒 38 JPanel Game1 = new JPanel(); 39 JButton btn01 = new JButton("panel:1"); 40 Game1.add(btn01); 41 42 //Game2 じゃんけん画面 43 JPanel Game2 = new JPanel(); 44 45 //Game3 じゃんけんに買った時の画面 46 JPanel Game3 = new JPanel(); 47 48 //Game4 じゃんけんに負けた時の画面 49 JPanel Game4 = new JPanel(); 50 51 GamePanel = new JPanel(); 52 layout = new CardLayout(); 53 54 //ゲームパネルにカードレイアウトを設定 55 GamePanel.setLayout(layout); 56 57 //ゲームパネルにGaem1~4パネルとラベルを設定 58 GamePanel.add(Game1, "OPPP"); 59 GamePanel.add(Game2, "Janken"); 60 GamePanel.add(Game3, "WINNN"); 61 GamePanel.add(Game4, "LOSEEE"); 62 63 //パネル設置 64 getContentPane().add(GamePanel); 65 66 } 67} 68 69 70

試したこと

デフォルトコンストラクタ以外に書いたり他のクラスファイルに記述して
呼び出してみたりいろいろやってみましたが
フレームしか表示されていないようです…。

補足情報(FW/ツールのバージョンなど)

Eclipse 4.19.0

TN8001👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

作ったフレームに追加したパネルが表示されません

sample_mnクラスのことですね?
定義はできていますし、コンストラクタもあります。

しかし作成(new)していません。newしているのは、JFrameです。
パネルを追加しているのはsample_mnですので、何も出なくて当然です。

これ実は私もよくやってしまいます^^;
なのでstatic void mainでは最低限の処理だけにして、コンストラクタで設定をするようにしています。
コンストラクタが長くなりますが、このミスはしにくく(さすがにすぐ気づく)なります。

オープニング画面->じゃんけん画面の遷移のみ(勝ち負けまで出すと、完成してしまいそうなので^^;

Java

1import java.awt.CardLayout; 2import javax.swing.JButton; 3import javax.swing.JFrame; 4import javax.swing.JLabel; 5import javax.swing.JPanel; 6import javax.swing.WindowConstants; 7 8public class JankenFrame extends JFrame { 9 public static void main(String[] args) { 10 new JankenFrame().setVisible(true); 11 } 12 13 private JPanel gamePanel; 14 private CardLayout layout; 15 16 JankenFrame() { 17 setTitle("じゃんけん"); 18 setSize(400, 350); 19 setLocationRelativeTo(null); 20 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 21 22 JPanel OPPP = new JPanel(); 23 JButton btn01 = new JButton("やる"); 24 btn01.addActionListener(e -> layout.show(gamePanel, "Janken")); 25 OPPP.add(btn01); 26 27 JPanel Janken = new JPanel(); 28 JButton gu = new JButton("ぐぅ"); 29 Janken.add(gu); 30 JButton tyoki = new JButton("ちょき"); 31 Janken.add(tyoki); 32 JButton pa = new JButton("ぱぁ"); 33 Janken.add(pa); 34 35 JPanel WINNN = new JPanel(); 36 WINNN.add(new JLabel("勝ちいい")); 37 38 JPanel LOSEEE = new JPanel(); 39 LOSEEE.add(new JLabel("負けええ")); 40 41 layout = new CardLayout(); 42 gamePanel = new JPanel(layout); 43 44 gamePanel.add(OPPP, "OPPP"); 45 gamePanel.add(Janken, "Janken"); 46 gamePanel.add(WINNN, "WINNN"); 47 gamePanel.add(LOSEEE, "LOSEEE"); 48 49 add(gamePanel); 50 } 51}

投稿2021/06/17 11:35

TN8001

総合スコア9801

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

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

Bamimimi

2021/06/18 00:34

回答ありがとうございます! メインメソッドのデフォルトコンストラクタは自動で実行されるものだと思い込んでいたので大変勉強になりました。 参考に自分のソースでも色々試してみたのですが、私が勉強したコンストラクタの呼び出し方 this(); では呼び出せず Sample_mn Sample = new Sample_mn(); のインスタンスを作成することで呼び出せます(println等はコマンドプロンプトに出る)が、パネルは表示されませんでした。 教えて頂いたフレームのソースをデフォルトコンストラクタに挿入して new コンストラクタ名().setVisible(true); ではきちんと表示されました。 JframeをextendしているclassなのでsetTitle等をそのまま書いてもJFrameに なるのかな?と思うのですが、オブジェクトを作ってもコンストラクタに記述した JPanelが生成されないのはなぜなのでしょうか? 回答を頂いたのに再度の質問で申し訳ありません・・・ お忙しければスルーしていただいて構いません。 画面遷移のボタンの作成まで頂いて感激しました。 じゃんけんをするソースは考えるのが楽しくて先に完成させてあるので頑張って実装したいと思います! お時間を割いていただいて本当にありがとうございました。
TN8001

2021/06/18 01:26 編集

> メインメソッドのデフォルトコンストラクタは自動で実行されるものだと思い込んでいたので大変勉強になりました。 自動で実行されるのは static void mainメソッドだけです。 mainしかないようなプログラムもよくありますよね? コンストラクタはなくてもいいし呼ばれもしません。 なので呼びたい場合は自分で呼ばなければなりません。 > this(); これは引数ありの**コンストラクタ内**から、引数なしのコンストラクタを呼ぶ場合の表記です。 例えば new JButton() とすると JButtonクラスの引数なしコンストラクタを呼び、new JButton("やる") なら文字列引数のコンストラクタを呼ます。 ここまでは分かっておられると思います。 static void main が同じクラスにあるので混乱しますが、 public class Program { public static void main(String[] args) { JFrame Mainfr = new sample_mn(); // 省略 Mainfr.setVisible(true); } } と、main だけある別のクラスから sample_mn を作成(new)しているのと同じことです。 main だけある別のクラスを作るのは無駄なので、一緒になっているのです。 > Sample_mn Sample = new Sample_mn(); > のインスタンスを作成することで呼び出せます(println等はコマンドプロンプトに出る)が、パネルは表示されませんでした。 質問のコードから sample_setting sett = new sample_setting(); は、ないので丸ごと削除。 JFrame Mainfr = new JFrame(); を JFrame Mainfr = new sample_mn(); に変更。 で、私の手元では panel:1ボタンは出ますが、出ないということでしょうか? だとすると違いは sample_setting しかないですね。 sample_setting の内容によっては sample_mn がでないこともあるのかなぁ? ちょっとこれと言って思いつきませんが、sample_settingの行を一旦消してもらえば出るはずです。 > JframeをextendしているclassなのでsetTitle等をそのまま書いてもJFrameに > なるのかな?と思うのですが、オブジェクトを作ってもコンストラクタに記述した > JPanelが生成されないのはなぜなのでしょうか? その考えであっています。出ないのは何か別の理由です。
Bamimimi

2021/06/18 02:22

コメントありがとうございます! >this(); についても勘違いしておりました。 引数があるコンストラクタ内からthis();で 引数がないコンストラクタ内ではthis(引数);で 呼び出せるということですね。 sample_setting sett = new sample_setting();は消去を忘れておりました。 sample_setteingには何も書いてないので混乱させて申し訳ありません。 >と、main だけある別のクラスから sample_mn を作成(new)しているのと同じことです。 >main だけある別のクラスを作るのは無駄なので、一緒になっているのです。 >JFrame Mainfr = new JFrame();を >JFrame Mainfr = new sample_mn();に変更。 これを読んで自分のソースを助言頂いた通りに書き換えてパネルが出るようになり それでようやく自分のミスが理解できました。 ただインスタンスを作成してJFrame Mainfr = new JFrame();と書いただけでしたので; 一人ではどうしても理解が及ばず困っていた所を 終始わかりやすい解説で助けていただき本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問