2014-01-30 169 views
1

關於javas組件等的非常綠色,請原諒我提供的信息不夠!如何在JFrame內切換JPanels

請考慮以下代碼。添加框架中顯示的菜單和菜單,沒問題。 我希望在調用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 TS的框架後,我建議做這樣的EDT重UI變化線程以避免干擾。

+0

repaint()沒有區別。對不起,我現在對線程很不熟悉。 – user3185667

1

添加的GamePanel後,做validate();

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

}

+0

不錯,工作!但是,完成後,GamePanel中的我的keyListener在完成後似乎不起作用。對此有何想法? – user3185667

+0

在你的第一篇文章中添加GamePanel類,看看有什麼不對。 – TroyAndAbed

+0

關於這個問題關於另一個問題,應該先檢查一下吧!在validate()之後;我打電話 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); 
    } 
}