java—有些JPanel没有显示在我的cardlayout面板中

sigwle7e  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(307)

我使用卡片布局来显示和隐藏我制作的每个面板。在最初的几天里,我制作的前5个面板都工作得很好。奇怪的是,突然之间,我新的第6个面板似乎没有出现。任何地方都没有语法错误,我再次检查了我所有的代码,以寻找任何打字错误,拼写错误,失败的复制粘贴,但似乎无法找到任何异常。。。今天我试着继续制作第七组,但是第七组也没有出现。

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个面板后来被添加到构造函数外部(makegamepanel方法内部)

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

这是我用来控制显示哪个面板的方法。它在索引0到5的面板中工作(在上面的屏幕截图中列出)

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

当我单击上面任何面板中的一些jbuttons时,我将为这个动作侦听器分配适当的面板名称,以便它可以调用方法来显示适当的面板。

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和gameplay),它们在我的游戏控制器(处理所有游戏逻辑运行的类)中调用。我已经检查了以确保我的控制器和我的视图都是相互链接的,所以这似乎不是不同示例的问题。

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面板和游戏玩法shuffle,但屏幕上实际发生的是:当调用changing panel方法来显示dealershuffle时,前一个面板(gamesettings)实际上被禁用,但dealershuffle没有出现,所以屏幕停留在游戏设置面板的后像上,没有任何东西可供我点击或互动。不用说,我后来的游戏面板也没有出现。
如果有人想检查我的整个程序运行,这里是我的压缩文件链接:程序压缩文件的代码将是一个相当混乱的,因为我只是开始在一个程序上实现图形用户界面,这是以前运行的控制台。
谢谢你的时间和帮助!

s4chpxco

s4chpxco1#

nvm,我可能还没有解决我的代码目前的结构问题,也没有了解到是什么原因导致了这个问题,但我设法让它工作后,从零开始重新构建和重组我的代码。这次不是在viewcontroller中创建jpanel并在其中添加它们,而是在controller中构建jpanel并将它们传递到viewcontroller中以添加到jframes。总之,问题解决了。感谢所有的帮助!

相关问题