Java 组件未添加到JFrame

Java 组件未添加到JFrame,java,swing,jframe,jcomponent,Java,Swing,Jframe,Jcomponent,我最初计划不依赖java的窗口组件系统。然而,我不得不使用它,因为它有双缓冲。这就导致了我目前的问题。JPanel有两个组件MainMenuDisplay和GameDisplay。无论何时单击开始按钮,我都希望它摆脱mainMenuDisplay,并用新的游戏显示替换它。但是,每当我尝试这样做时,它都会删除mainMenuDisplay,并且不会添加游戏显示,即使代码显然正在运行。因此它只留下JFrame,没有任何组件来运行其paintComponent方法。不会抛出任何错误。那么为什么它不添加

我最初计划不依赖java的窗口组件系统。然而,我不得不使用它,因为它有双缓冲。这就导致了我目前的问题。JPanel有两个组件MainMenuDisplay和GameDisplay。无论何时单击开始按钮,我都希望它摆脱mainMenuDisplay,并用新的游戏显示替换它。但是,每当我尝试这样做时,它都会删除mainMenuDisplay,并且不会添加游戏显示,即使代码显然正在运行。因此它只留下JFrame,没有任何组件来运行其paintComponent方法。不会抛出任何错误。那么为什么它不添加新的游戏显示呢? 另外,请不要因为我使用静态对象而对我大喊大叫

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

相反,您可以使用可见性概念来实现问题的解决方案。 只需在另一个面板上方添加两个面板 为一个设置可见性为true,为另一个设置可见性为false。。。 根据用途改变可视性

在开始按钮onclick event listener中..编写以下代码..它就像一个符咒

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

调用add方法时,组件层次结构将无效。如果容器已按原样显示,则需要调用revalidate方法。OTOH谷歌CardLayout。它正是你需要做的。