而不是尝试添加删除组件,使用 CardLayoutCardLayout cardLayout = new CardLayout();JPanel mainPanel = new JPanel(cardLayout);MenuPanel menu = new MenuPanel();GamePanel game = new GamePanel();mainPanel.add(menu, "menu");mainPanel.add(game, "game");...public void gameOn() {
cardLayout.show(mainPanel, "game");}
当gameOn()被召唤时,menu将被推到后面,并被推到game前面。
这样您就不必继续添加和删除
这是一个你可以运行的例子import java.awt.BorderLayout;import java.awt.CardLayout;import java.awt.Color;import java.awt.Dimension;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.SwingUtilities;public class GameFrame extends JFrame implements ActionListener{
CardLayout cardLayout;
JPanel mainPanel;
MenuPanel menu;
GamePanel game;
public GameFrame() {
cardLayout = new CardLayout();
mainPanel = new JPanel(cardLayout);
menu = new MenuPanel();
game = new GamePanel();
mainPanel.add(menu, "menu");
mainPanel.add(game, "game");
JButton goGame = new JButton("Go TO Game");
goGame.addActionListener(this);
add(mainPanel);
add(goGame, BorderLayout.SOUTH);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setLocationByPlatform(true);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
gameOn();
}
public void gameOn() {
cardLayout.show(mainPanel, "game");
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
GameFrame gameFrame = new GameFrame();
}
});
}}class MenuPanel extends JPanel {
public MenuPanel() {
setBackground(Color.GREEN);
add(new JLabel("Menu"));
}
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 300);
}}class GamePanel extends JPanel {
public GamePanel() {
setBackground(Color.BLUE);
add(new JLabel("Game"));
}
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 300);
}}