2014-01-30 3 views
1

Весь зеленый цвет относительно компонентов javas и т. Д., Поэтому, пожалуйста, извините меня, если недостаточно информации, предоставленной мной!Как переключить JPanels внутри JFrame

Просмотреть приведенный ниже код. Добавление меню и меню, отображаемых в кадре, не представляет проблемы. Я хочу, когда вызывается gameOn(), чтобы удалить меню и вместо этого начать игру. Приведенный ниже код только делает рамки «пустыми», а игровая панель не добавлена.

Любые мысли/предложения о том, как их исправить? В MenuPanel есть mouselistener.

public class GameFrame extends JFrame { 

private MenuPanel mp; //extends JPanel 
private GamePanel gp; //extends JPanel 

public GameFrame() { 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setSize(new Dimension(GameFrame.XSIZE, GameFrame.YSIZE)); 
    setLocationRelativeTo(null); 
    setVisible(true); 
    mp = new MenuPanel(this); 

    add(mp); 
} 
public void gameOn() { 
    remove(mp); 
    GamePanel gp = new GamePanel(5); 
    add(gp); 
} 
} 
+0

Попробуйте сделать «перекрасить();» после добавления (gp); – TroyAndAbed

+0

нет улучшение sry – user3185667

ответ

0

Вам нужно repaint() после удаления одной панели и добавить еще один, setVisible(true) должно быть сделано после того, как вы добавили COMPONEN тс к раме, и я рекомендую делать тяжелые изменения пользовательского интерфейса, как, что на EDT чтобы избежать помех.

+0

repaint() не имеет значения. Извините, Im очень незнакомый с потоками в данный момент. – user3185667

1

После добавления GamePanel, сделать validate();

public void gameOn() { 
remove(mp); 
gp = new GamePanel(5); 
add(gp); 
validate(); 

}

+0

Ницца, это сработало! Но, когда это делается, мой keyListener в GamePanel, похоже, не работает после этого. Любые мысли по этому поводу? – user3185667

+0

Добавьте класс GamePanel в свой первый пост, чтобы узнать, что случилось. – TroyAndAbed

+0

Foudn другой вопрос относительно этого вопроса, должен был проверить его сначала sry! после проверки(); Я позвонил gp.requestFocusInWindow() , и он сработал. Thx за помощь! – user3185667

6

Вместо того, чтобы пытаться добавить компоненты удалить, используя CardLayout

CardLayout 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); 
    } 
} 
Смежные вопросы