私はSpacePotaters(JFrameのサブクラス)と呼ばれるトップレベルのGUIクラスを持っており、そのコンテンツペインにpanelViews(CardLayoutレイアウトマネージャを使用する)というJPanelを追加します。とりわけ、私はPanelViewにカードとしてMainMenuオブジェクト(JPanelのサブクラス)とGameViewオブジェクト(JPanelのサブクラス)を追加します。その便利な場合CardLayoutに間違ったJPanelが表示されます。
public SpacePotaters(){
super("Space Potaters");
Container content = getContentPane();
// initialize components
gameView = new GameView(this);
mainMenu = new MainMenu(this);
leaderboard = new Leaderboard(this);
instructions = new JPanel(); // to do
cLayout = new CardLayout();
// add "cards" to CardLayout manager
panelViews = new JPanel(cLayout);
panelViews.setPreferredSize(new Dimension(WINDOW_WIDTH, WINDOW_HEIGHT));
panelViews.add("gameView", gameView);
panelViews.add("mainMenu", mainMenu);
panelViews.add("leaderboard", leaderboard);
panelViews.add("instructions", instructions);
// initially display menu menu
content.add(panelViews);
cLayout.show(panelViews,"mainMenu");
addWindowListener(this);
pack();
setResizable(false);
// relocate window to center of screen
setLocationRelativeTo(getRootPane());
}
、メインメニューの塗装方法はここにある:
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(mainMenuBackground, 0, 0, spTop.getWindowWidth(), spTop.getWindowHeight(), null);
}
今私はちょうど背景画像を描く - 後で私がクリックしたときには、別のカードに切り替えるということJButtonがを追加します。
私は、メインメニューカードから始め、必要に応じて他のカードに切り替えることを考えています。私はプログラムを実行し、メインメニューのカードが一時的に点滅してから、gameView用に作成されたイメージに置き換えられていることに気付きました。実際にそのカードに切り替えるまでgameViewのグラフィックをレンダリングするのを待たなければならないことがわかっているので、ゲームが早期に開始されることはありません。それは私が混乱するところではない。私が待っていなくても、gameViewはそれを見ることができずに起動してはいけませんか?言い換えれば、mainMenuは、gameViewの内部で何が起こっているかにかかわらず、唯一の目に見えるカードではないでしょうか?
問題は、アクティブなレンダリングとダブルバッファリングを使用するgameView内のものだとわかりました。 GameViewは、ゲームの回ループと呼ばれるこの方法た:このメソッドの本体をコメントアウト
public void paintScreen(){
// get fresh graphics context for GameView each time
Graphics context = getGraphics();
if (context != null && dbImage != null){
context.drawImage(dbImage, 0, 0, null);
}
context.dispose();
}
は、所望の結果を生成する - だけはmainMenuが示されています。私はなぜこれが当てはまるのか混乱しています。私は、各コンポーネント(JFrame、JPanelなど)に独自のグラフィックスコンテキストがあると思っていました。したがって、GameView内でgetGraphics()を呼び出すと、spTopまたはpanelViewsのグラフィックスコンテキストではなく、gameViewパネルのグラフィックスコンテキストが返されるべきではありませんか?また、特定のグラフィックスコンテキストのみを変更するため、gameViewパネルが表示されていない場合(mainMenuオブジェクトでCardLayoutのshow()メソッドを使用していてはいけません)、メインメニューのビューには影響しません。何か案は?
注:gameViewとmainMenuの両方をisVisible()でテストすると、gameViewはfalseを返し、mainMenuはtrueを返します。また、getMraphics()を使用して、mainMenu、spTop、およびgameViewのグラフィックスコンテキストがすべて異なっているかどうかをテストしました。 gameViewはそれ自身のグラフィックスコンテキスト上に画像を描画しており、表示されません。paintScreen()内のdrawImage()の効果はまだです!本当に混乱しています。
すぐに役立つように、[SSCCE](http://sscce.org/)を投稿してください。 –
gameViewがアクティブなカードの前にpaintScreen()を呼び出すコードがありますか? GameViewがパネルを表示しているかどうかにかかわらず、そのメソッドがゲーム画面をペイントするように見えます。 –
カスタムペイントにはgetGraphics()を使用しないでください。絵は一時的なものです。 JComponentまたはJPanelのpaintComponent()メソッドをオーバーライドします。 – camickr