【问题标题】:Some JPanels are not showing in my CardLayout Panels一些 JPanel 没有显示在我的 CardLayout 面板中
【发布时间】:2016-09-05 15:37:32
【问题描述】:

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

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 面板和 GamePlay shuffle,但屏幕上实际发生的是:当调用更改面板方法以显示 DealerShuffle 时,之前的面板(GameSettings)实际上被禁用了,但 DealerShuffle 没有出现,所以屏幕卡在 GameSetting 面板的残影上,没有任何东西可供我点击或交互。不用说,之后我的 GamePlay 面板也没有出现。

如果有人想查看我的整个程序以运行,这里是我的压缩文件的链接: Program zip file 代码会很乱,因为我才开始在以前在控制台上运行的程序上实现 GUI。

感谢您的宝贵时间和帮助!

【问题讨论】:

  • 您没有名为“GamePlay”的面板,但有一个名为“GameSetting”的面板。在创建页面和请求显示哪个页面时,不应使用字符串文字。您应该创建一个字符串变量,并在创建面板和请求显示页面时使用相同的变量 - 这样,如果您在某处拼错字符串,您将永远不会遇到难以找到的错误。
  • 实际上,我从未为任何面板/页面设置任何尺寸(它们完全适合 JFrame)。这些周边仅用于整齐地对齐面板上的组件。尽管如此,我尝试了你的提示并给了我的 DealerShuffle 一个维度,但这仍然不起作用>
  • @FredK,我确实有一个 GamePlay,它是在下面的方法中创建的。我已经检查了两倍,三倍,四倍,但我输入的名字是正确的。不过,谢谢你的建议,我会改用字符串变量。
  • 在那些jpanel的构造函数里面,你有没有setVisible(true)?
  • @Orin2005 最初,不,因为可见性无论如何都要由 cardLayout 设置,但即使我尝试在构造函数中将可见性更改为 true,也没有任何区别。跨度>

标签: java eclipse layout


【解决方案1】:

Nvm,我可能没有解决我的代码当前结构方式的问题,或者首先了解导致问题的原因,但是在再次从头开始构建它并重组我的代码后,我设法让它工作.这次不是在 viewController 中创建 JPanel 并将它们添加到其中,而是在 Controller 中构建 JPanel 并将它们传递给 viewController 以添加到 JFrame。所以无论如何,问题解决了。感谢所有帮助过的人!

【讨论】:

    猜你喜欢
    • 2013-04-13
    • 1970-01-01
    • 2012-11-05
    • 2016-08-15
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多