我使用卡片布局来显示和隐藏我制作的每个面板。在前几天,它已经为我制作的前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。
感谢您的时间和帮助!
答案 0 :(得分:0)
Nvm,我可能没有解决我的代码当前结构化的方式或者首先了解导致问题的原因,但是我在从头开始构建它并重构我的代码后设法让它工作了。这次不是在viewController中创建JPanel并在里面添加它们,而是在Controller中构建JPanel并将它们传递给viewController以添加到JFrames。所以无论如何,问题解决了。感谢所有帮助过的人!