2014-09-29 33 views
0

我原本计划不依赖于java的窗口组件系统。但是,我被迫使用它,因为它具有双缓冲。所以这导致我目前的问题。有两个JPanel组件MainMenuDisplay和GameDisplay。无论何时您点击开始按钮,我都希望它摆脱mainMenuDisplay,并用新的游戏显示替换它。但是,每当我尝试这样做时,它都会删除mainMenuDisplay,即使代码显然正在运行,也不会添加gameDisplay。所以它只是让JFrame没有任何组件来运行它们的paintComponent方法。没有错误被抛出。那么为什么它不添加新的GameDisplay? P.S.请不要因为使用静态对象而对我大吼大叫。未添加到JFrame的组件

Start.WINDOW.changeCurrentDisplay(new GameDisplay()); 
//Creates a new GameDisplay and passes it the JFrame 
//This is inside MainMenuDisplay 

//This is part of the JFrame class 
Display mainMenuDisplay; 
Display gameDisplay; 
//Display class extends JPanel 

public WindowManager() { 
    super("Mountours - And - Men"); 

    setSize(settings.windowHeight, settings.windowWidth); 
    setLocationRelativeTo(null); 

    setResizable(settings.resizable); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBackground(Color.WHITE); 

    currentDisplay = new MainMenuDisplay(); 
    addKeyListener(currentDisplay.input); 
    addMouseListener(currentDisplay.input); 
    add(currentDisplay); 


    setVisible(true); 
} 

public void changeCurrentDisplay(Display display) { 
    removeAll();//Removes the MainMenuDisplay 
    mainMenuDisplay = display; 
    add(display);//Attempts to add component to JFrame, but doesn't, no errors either 
    addKeyListener(display.input); 
    addMouseListener(display.input); 
} 
+1

当您调用add方法时,组件层次结构将失效。如果容器已经显示(因为它在这种情况下),你需要调用revalidate方法。 OTOH Google for CardLayout。它完全正是你需要做的。 – dic19 2014-09-29 03:23:02

回答

0

相反,你可以使用可视性的概念来实现解决您的问题。 只需添加两个小组在另一个之上,并 设置可见真一假其它...根据 变化中能见度usuage

在启动按钮的onclick事件侦听器..write以下code..it就像魅力

GameDisplay.setVisible(true); 
MainMenuDisplay.setVisible(false);