2014-01-30 2 views
1

javas 구성 요소와 관련하여 매우 녹색이므로 제게 주어진 정보가 충분하지 않으면 실례합니다.JFrame 내부의 JPanel을 전환하는 방법

다음 코드를 사용하십시오. 메뉴 및 메뉴를 프레임에 추가하면 아무런 문제가 없습니다. 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); 
} 
} 
하나 개 패널을 제거하고 다른 추가, setVisible(true)가 수행해야 당신이 프레임에 componen에게 TS를 추가 한 후 나는 EDT에 같은 무거운 UI 변경을하는 것이 좋습니다 후에는 repaint()해야합니다
+0

시도를 실행할 수있는 예제 추가 후 (gp); – TroyAndAbed

+0

아무런 개선이 없었습니다 – user3185667

답변

0

간섭을 피하기 위해 스레드.

+0

repaint()는 차이가 없습니다. 죄송합니다. 임은 현재 스레드에 익숙하지 않습니다. – user3185667

1

의 GamePanel를 추가 한 후, gameOn()가 호출 될 때 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"); 
} 

menuvalidate();

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

}

+0

니스, 그 일했다! 하지만 GamePanel의 keyListener가 끝나면 작동하지 않는 것 같습니다. 그것에 관한 어떤 생각? – user3185667

+0

처음 게시물에 GamePanel 클래스를 추가하여 잘못된 것을 확인하십시오. – TroyAndAbed

+0

Foudn 그 문제에 관한 또 다른 질문은, 그것을 먼저 확인해야한다! validate() 후; 나는 gp.requestFocusInWindow()를 라고 불렀다. Thx 도움! – user3185667

6

대신 제거 구성 요소를 추가하려고 노력은, 사용합니까 뒤쪽으로 밀어 넣고 앞쪽에 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); 
    } 
} 
관련 문제