Java:删除 JLayeredPane 并添加 ContentPane



我使用分层面板在我的 JFrame 上设置了一个游戏菜单屏幕。我想从 JFrame 中删除所有组件并添加新的内容面板。我花了几个小时试图解决这个问题,但我无法想出一个好的解决方案。

public myJFrame ()
{
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setLayout(new BorderLayout());
    setSize (1030, 727);
    setVisible(true);
    newGame = new JButton();
    loadGame = new JButton();
    quitGame = new JButton();
    newGame.setBounds(new Rectangle(10,600,200,110));
    newGame.setIcon(pic1);
    newGame.setOpaque(false);
    newGame.setContentAreaFilled(false);
    newGame.setBorderPainted(false);
    loadGame.setBounds(new Rectangle(210,600,200,110));
    loadGame.setIcon(pic2);
    loadGame.setOpaque(false);
    loadGame.setContentAreaFilled(false);
    loadGame.setBorderPainted(false);
    quitGame.setBounds(new Rectangle(410,600,200,110));
    quitGame.setIcon(pic3);
    quitGame.setOpaque(false);
    quitGame.setContentAreaFilled(false);
    quitGame.setBorderPainted(false);
    background.setBounds(0,0,1030,727);
    titletext.setBounds(0,0,726,170);
    lp = getLayeredPane();
    lp.add(titletext, new Integer (4)); //* I messed around with these integers quite a bit. *//
    lp.add(newGame, new Integer (20));   //* They don't seem to be logically adding to the panel. *//
    lp.add(loadGame, new Integer(20));  //* I want the background and titletext to appear behind *//
    lp.add(quitGame, new Integer (20));  //* the JButtons. *//
    lp.add(background, new Integer (1));
    newGame.addActionListener(this);
    loadGame.addActionListener(this);
    quitGame.addActionListener(this);
}
public void actionPerformed(ActionEvent event) 
{
    Object obj = event.getSource();
    if (obj == newGame)
    {
        System.out.println("New Game");
        lp.remove(4);
        getContentPane().add(mop, "Center");         //* Removes myWelcomePanel mwp and adds myOptionsPanel mop *//                          
        repaint();
        mop.startgame.addActionListener(this);
    }

我尝试重新绘制,重新验证和删除某些组件,但似乎没有任何效果。我希望上面发布的代码删除标题文本图像,但它会删除背景图像。

我不想弄乱第二个内容窗格,因为它包含我之前配置的许多对象。

JLayeredPane.remove(int)指的是子项的绝对索引,而不是其层位置。 为什么不通过引用删除,或者简单地将子组件的可见性设置为隐藏?

我找到了一种方法来让它工作。似乎我必须单独删除每个组件,而不是使用 removeAll()。我确定了一个新的 GridLayout sp 并将其设置为布局。最后,我不得不使用重新验证而不是重新绘制。重新粉刷给我留下了空白的屏幕。如果有人能评论这里发生的事情,我将不胜感激!

public void actionPerformed(ActionEvent event) 
{
    Object obj = event.getSource();
    if (obj == newGame)
    {
        System.out.println("New Game");
        lp.remove(background);
        lp.remove(titletext);
        lp.remove(newGame);
        lp.remove(loadGame);
        lp.remove(quitGame);
        getContentPane().setLayout(sp);
        getContentPane().add(mop, "Center");
        revalidate();
        mop.startgame.addActionListener(this); 
    }

最新更新