2016-05-10 8 views
3

Ich verwende Kartenlayout, um jedes Panel, das ich gemacht habe, ein- und auszublenden. In den ersten paar Tagen hat es für die ersten 5 Panels funktioniert, die ich gemacht habe. Das Seltsame ist, plötzlich erscheint mein neues, 6. Panel nicht mehr. Es gibt nirgends einen Syntaxfehler, ich habe alle meine Codes nochmals durchgesehen, um nach Tippfehlern, Rechtschreibfehlern und fehlgeschlagenen Kopierpasten Ausschau zu halten, aber ich finde, ich kann nichts Außergewöhnliches finden ... Ich habe versucht, weiterzumachen das 7. Panel heute zu machen, aber das 7. Panel wurde auch nicht angezeigt.Einige JPanels werden nicht in meinen CardLayout-Panels angezeigt

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(); 
} 

Dies ist mein ViewController (Klasse, die den Hauptfluss meiner GUI steuert). Ich habe ein Hauptpanel erstellt und das Layout auf CardLayout eingestellt, und alle anderen Panels erstellt und in das Hauptfenster eingefügt. Die 7. Platte wurde in später hinzugefügt, außerhalb der Konstruktor (innen makeGamePanel Methode)

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

Dies ist meine Methode verwendet, zu steuern, welche Platte zu zeigen. Es funktioniert von der Platte in den Index 0 bis 5 (Liste siehe Screenshot oben)

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); 
    } 
} 

Als ich oben in einem der Module auf einigen JButtons klicken, werde ich diese Aktion Hörer mit dem entsprechenden Panel Namen zuweisen, so dass Es kann die Methode aufrufen, um das entsprechende Panel anzuzeigen.

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"); 

Mein Problem ist mit dem 6. und 7. Indexfeld (DealerShuffle und GamePlay), die in meinem Game-Controller (Klasse, die alle Spiellogik Laufgriffe) genannt werden. Ich habe überprüft, um sicherzustellen, dass mein Controller und meine Sicht beide miteinander verknüpft sind, also scheint es kein Problem von verschiedenen Instanzen zu sein.

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 

Dies sind die Ergebnisse eines normalen Laufs. In den unteren paar Zeilen zeigt es, dass mein Programm richtig läuft, und dass es sogar versucht, das DealerShuffle-Panel und GamePlay shuffle zu zeigen, aber was tatsächlich auf dem Bildschirm passiert ist: wie die wechselnde Panel-Methode aufgerufen wird, um DealerShuffle anzuzeigen das vorherige Panel (GameSettings) ist zwar deaktiviert, aber DealerShuffle wird nicht angezeigt, sodass der Bildschirm an einem Nachbild des GameSetting-Bereichs hängen bleibt, ohne dass ich darauf klicken oder mit ihm interagieren kann. Unnötig zu sagen, dass mein GamePlay-Panel danach auch nicht auftauchte.

Wenn jemand will mein ganzes Programm überprüfen, hier zu laufen ist der Link zu meinen ZIP-Dateien: Program zip file Die Codes in einem ganz ein Chaos sein werden, da ich nur GUI auf einem Programm gestartet habe Umsetzung der lief vorher auf der Konsole ab.

Vielen Dank für Ihre Zeit und Hilfe!

+0

Sie haben kein Panel namens "GamePlay", aber Sie haben eines namens "GameSetting". Sie sollten beim Erstellen der Seiten und beim Anfordern der anzuzeigenden Seite keine Zeichenfolgenliterale verwenden. Sie sollten eine String-Variable erstellen und diese Variable verwenden, wenn Sie die Panels erstellen und die Anzeige der Seite anfordern. Auf diese Weise werden Sie nie einen schwer zu findenden Fehler finden, wenn Sie die Zeichenfolge irgendwo falsch schreiben. – FredK

+0

Eigentlich habe ich für keines der Panels/Seiten irgendwelche Dimensionen festgelegt (sie passen einfach vollständig auf den JFrame). Diese Perimeter wurden lediglich dazu verwendet, meine Komponenten sauber auf den Platten auszurichten. Nichtsdestotrotz habe ich deinen Tipp ausprobiert und meinem DealerShuffle eine Dimension gegeben, die aber immer noch nicht funktioniert hat.>< – Mei

+0

@FredK, ich habe ein GamePlay, das nachher in der Methode unten erstellt wurde. Und ich habe bereits doppelt, dreifach, vierfach überprüft, aber die Namen, die ich angegeben habe, sind korrekt. Trotzdem danke ich Ihnen für Ihren Rat, ich werde stattdessen String-Variablen übernehmen. – Mei

Antwort

0

Nvm, ich habe das Problem mit der Art und Weise, wie meine Codes derzeit strukturiert sind oder gelernt haben, was das Problem verursacht hat, vielleicht nicht behoben, aber ich habe es geschafft, es nach dem Aufbau wieder von Grund auf neu zu erstellen und meine Codes. Diesmal, anstatt die JPanels im viewController zu erstellen und sie im Inneren hinzuzufügen, habe ich stattdessen die JPanels im Controller erstellt und sie an den viewController übergeben, um sie den JFrames hinzuzufügen. Also sowieso, Problem gelöst. Danke an alle die geholfen haben!

Verwandte Themen