我使用分层面板在我的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图像,但它会删除背景图像。
我不想弄乱第二个内容窗格,因为它包含我之前配置的许多对象。
答案 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);
}