Java:删除JLayeredPane并添加ContentPane

时间:2015-04-30 04:16:07

标签: java swing jlayeredpane

我使用分层面板在我的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);
    }

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:-1)

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

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