質問: new Dimension(image.getWidth(null),image.getHeight(null)); setPreferredSize(size); setMaximumSize(size); setMinimumSize(size); setLayout(null); } public void paintComponent(Graphics g){ g.drawImage(image, 0, 0, null); } } ``` StartScreenのフィールドでカードレイアウトがインスタンス化されてるのはいずれデフォルトのパネルに適応しパネルを追加して画面遷移を行いたいと考えているからです。 ### 補足情報(言語/FW/ツール等のバージョンなど) 作業環境はEclipseです。画像はインポートで取り込み同じプロジェクトファイル内にあります。画像の大きさは1200×1035です。
回答: なんというか、いろいろと不可解なコードです。**(修正確認しました)** * **命名がおかしい** MainとImagePanelがJFrame?SmartScreenがJPanel? * **画像の取り扱いがおかしい** 1200x1035の画像はアイコンとは呼べないと思います。 また、どうしてJFrameにべた張りしようとしているのでしょうか。 * **コンポーネントの自己主張が激しい** 特にSmartScreen。自身をaddする前にsetVisible(true)にしてしまっています。 あとMainのコンストラクタは完全に無駄だと思います。 * **setLayout(null)** せっかくlayout用意したのに使わないんですか? もっと簡潔に書けるはずです。 重複して書いているからフレームも二つ出て、処理の順序が前後しているからまっしろです。 追記 デバッグしてみましたが、それなりの量書き換える必要がありました。 要点は次のとおりです。 * **pack()とsetVisible(true)の呼ばれるタイミングを適切にする** これらのメソッドはその性格上、コンポーネントの配置がすべて終わった時に呼ばれるべきです。 * **SmartScreenがパネルとして機能していない** フィールドのmainpaneに対して操作をしているので、SmartScreenのインスタンスjpは真っ白です。 * **パネルの親子関係に意識を向ける** 下記のコードを見る限り、mainpaneはbackpaneの子なのですよね? > > > ``` > backpane.add(mainpane); > ``` > > メインとなるフレームから子を直接呼び出すのはおかしな設計です。 * **フレームに与えるのは親のパネル** 直前の項と重複しますが、子をaddしてどうするんです? > > > ``` > StartScreen jp = new StartScreen(); > main.getContentPane().add(jp); > ``` > > * **必要のないsetVisibleを削る** しっかりとGUIを組めていれば、フレームを可視化すればそれで充分です。 設計的に改善するとしたら、次のどっちかですかね。 * MainクラスからImagePanelを呼び出し、ImagePanelからStartPanelを呼び出す。 * Mainクラスから両方を呼び出し、ImagePanelに子としてStartScreenを与える。 後者の方が柔軟な気もします。どんな機能を組み込むかにもよりますが。 ともかく、インタフェースを意識して作る必要はあるでしょう。 不明な点がありましたらコメントにてお知らせ下さい。 コードを見せちゃった方が早いんですが、質問者様のデバッグの機会を奪いたくないので。