2016-05-10 10 views
3

私が作成したすべてのパネルの表示と非表示には、カードレイアウトを使用しています。最初の数日間は、私が作った最初の5枚のパネルでうまくいきました。奇妙なことは、突然、私の新しい第6パネルは現れていないようです。どこでも構文エラーはありません。私はすべてのコードを見直して、誤植、スペルミス、コピー貼り付けに失敗しましたが、普通のものを見つけることができないようです...私は今日7番目のパネルを作りましたが、7番目のパネルも出ていませんでした。一部のJPanelがCardLayoutパネルに表示されません

public ViewController(int width, int height){ 
    this.WIDTH = width; 
    this.HEIGHT = height; 
    bgColor = new Color(255,204,153); 

    mainFrame = new JFrame ("Mei Centre"); 
    mainFrame.setPreferredSize(new Dimension(WIDTH,HEIGHT)); 
    mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    mainPanel = new JPanel(); 
    mainPanel.setLayout (new CardLayout(0,0)); 
    mainPanel.setBackground(bgColor); 
    mainPanel.setVisible(true); 
} 

public void makePanels(){ 
    // make most panels 
    mainPage = new MainPagePanel(this, WIDTH, HEIGHT, bgColor); 
    adminLoginPage = new AdminLoginPage(this, WIDTH, HEIGHT, bgColor); 
    playerLoginPage = new PlayerLoginPage(this, WIDTH, HEIGHT, bgColor); 
    playerLoginPrompt = new PlayerLoginPrompt (controller, this, WIDTH, HEIGHT, bgColor); 
    playerMainMenu = new PlayerMainMenu (controller, this, WIDTH, HEIGHT, bgColor); 
    gameSettings = new GameSettingPanel (controller, this, WIDTH, HEIGHT, bgColor); 
    dealerShuffle = new DealerShufflePanel (bgColor); 

    // add panels to frame in chronological order 
    mainPanel.add(mainPage, "MainPage"); // index 0 
    mainPanel.add(adminLoginPage, "Admin"); // index 1 
    mainPanel.add(playerLoginPage, "Player"); // index 2 
    mainPanel.add(playerLoginPrompt, "LoginPlayer"); // index 3 
    mainPanel.add(playerMainMenu, "PlayerMainMenu"); // index 4 
    mainPanel.add(gameSettings, "GameSetting"); // index 5 
    mainPanel.add(dealerShuffle, "DealerShuffle"); // index 6  

    mainFrame.add(mainPanel); 

    mainFrame.pack(); 
    mainFrame.setVisible(true); 
} 

// make and add GamePlayPanel into mainPanel 
public void makeGamePanel(Dealer dealer, GameTable table, ArrayList<GamePlayerInterface> gamePlayers) { 
    System.out.println("Making gamePlayPanel"); 
    gamePlay = new GamePlayPanel (controller, this, WIDTH, HEIGHT, bgColor, dealer, table, gamePlayers); 

    mainPanel.add(gamePlay, "GamePlay"); // index 7 
    mainPanel.repaint(); 
} 

これは私のViewController(私のGUIのメインフローを制御するクラス)です。私はメインパネルを作り、CardLayoutにレイアウトを設定し、他のすべてのパネルを作成してメインパネルに追加しました。 7パネルこれは、表示するパネル制御するために使用私の方法である

public void showPanel(String page) { 
    System.out.println("Showing panel -> " + page); 
    CardLayout cl = (CardLayout)(mainPanel.getLayout()); 
    cl.show(mainPanel, page); 
} 

(makeGamePanelメソッド内)コンストラクタ外、後に添加しました。そのように、それは、私が上記のパネルのいずれかでいくつかのJButtonが上でクリックすると、私は適切なパネル名で、このアクションリスナーを割り当てます5までのインデックス0にパネルから動作します(上のスクリーンショットではリスト)

private class changePanel implements ActionListener{ 
    String page; 

    public changePanel(String page){ 
     this.page = page; 
    } 

    public void actionPerformed(ActionEvent e){ 
     System.out.println(page + " is clicked"); 
     vController.showPanel(page); 
    } 
} 

適切なパネルを表示するメソッドを呼び出すことがあります。

private void startRound(GameTable table, ArrayList<GamePlayerInterface> gamePlayers, GamePlayer human) { 

    // GAME START! dealer shuffles cards 
    dealer.shuffleCards(); 
    view.showPanel("DealerShuffle"); 

    /* insert some delayer here*/  
    /*does some game logic action*/ 

    // make game play GUI 
    view.makeGamePanel(dealer, table, gamePlayers); 
    view.showPanel("GamePlay"); 

私の問題は、6日と7インデックスパネル(DealerShuffle、およびゲームプレイ)であり、私のゲームコントローラ(すべてのゲームロジックの実行を処理するクラス)に呼び出されます。 コントローラとビューが両方ともリンクされていることを確認したので、異なるインスタンスの問題ではないようです。

Enter Choice --> Player is clicked. 
Showing panel -> Player. 
LoginPlayer is clicked. 
Showing panel -> LoginPlayer. 
Player Login information entered, checking information 
username input got is : maggie 
password input got is : joey 
Showing panel -> PlayerMainMenu 
Play game button clicked 
Showing panel -> GameSetting 
Game start button clicked! 
Setting game with 1 opponents, 1 difficulty, 1 size. 
Game Start 
Showing panel -> DealerShuffle 
Dealer deals cards onto table 
Making gamePlayPanel 
Game Play Panel has been created 
Showing panel -> GamePlay 

これは正常な実行の結果です。下のほんの数行では、私のプログラムが正しく動作していること、そしてDealerShuffleパネルとGamePlayシャッフルを表示しようとしていることを示していますが、実際には画面上で何が起きているのでしょうか?以前のパネル(GameSettings)は実際には無効になっていますが、DealerShuffleは表示されません。そのため、GameSettingパネルの残像に画面が残っています。言うまでもなく、私のGamePlayパネルも後で表示されませんでした。

誰が実行するために私の全体のプログラムをチェックアウトしたい場合は、ここで私のZIPファイルへのリンクです: Program zip file は、私が唯一のどのプログラムにGUIを実装し始めてきたようにコードは、かなり混乱になります以前はコンソールで実行中でした。

ありがとうございました!

+0

"GamePlay"という名前のパネルはありませんが、 "GameSetting"という名前のパネルがあります。ページを作成するときや表示するページを要求するときには、文字列リテラルを使用しないでください。 String変数を作成し、パネルを作成するときやページの表示を要求するときに同じ変数を使用して、文字列のどこかに綴りが間違っていても見つけにくいエラーに遭遇することはありません。 – FredK

+0

実際、パネル/ページのディメンションは決して決まっていません(JFrameに完全にフィットしているだけです)。それらの周囲は、パネル上のコンポーネントをきれいに整列させるために使用されました。それにもかかわらず、私はあなたのヒントを試して、ディーラーシャッフルにディメンションを与えましたが、それでも動作しませんでした>< – Mei

+0

@FredK、私は後で作成されたGamePlayを以下の方法で持っています。そして私はすでにダブル、トリプル、クォドルプルチェックしていますが、私が入れた名前は正しいです。それにもかかわらず、あなたの助言に感謝します。代わりに文字列変数を採用します。 – Mei

答えて

0

Nvm、私は自分のコードが現在構造化されている方法で問題を解決していないかもしれないし、最初に問題の原因を学んでいたかもしれませんが、コード。今度は、viewControllerでJPanelを作成して内部に追加するのではなく、代わりにControllerでJPanelを構築し、viewControllerに渡してJFramesに追加します。とにかく、問題は解決しました。誰も助けてくれてありがとう!

関連する問題