2014-10-02 2 views
3

약 4 프레임의 JFrame이 있습니다. 주어진 조치 후에 한 패널을 동일한 위치의 다른 패널로 교체하려고합니다.한 JPanel을 다른 위치의 JPanel로 어떻게 바꿀 수 있습니까?

public void switchPanel(){ 
    mainPanel.remove(introPanel); 
    mainPanel.add(questionPanel); 
    this.repaint(); 
} 

윈도우의 원래 창조는 다음과 같습니다 : 당신은 질문

mainPanel.add(titlePanel); 
mainPanel.add(sidePanel); 
mainPanel.add(introPanel); 

답변

7

:

이합니다 ( this 객체가 JFrame를 확장하는 클래스이다)처럼 전환에 대한 나의 방법은 보인다

한 JPanel을 다른 위치의 JPanel로 어떻게 바꿀 수 있습니까?

매우 쉽게 :이 도구는이 상황을 위해 만들어진 도구이므로 CardLayout을 사용하십시오.

다음과 같은 상수가 있다면 :

public static final String INTRO_PANEL = "intro panel"; 
public static final String QUESTION_PANEL = "question panel"; 

을 한 다음에 JPanel의 교환 수 있도록

mainPanel.setLayout(cardLayout); 
mainPanel.add(introPanel, INTRO_PANEL); 
mainPanel.add(questionPanel, QUESTION_PANEL); 

cardLayout.show(mainPanel, INTRO_PANEL); 

처럼 JPanel의의의를 추가 :

cardLayout.show(mainPanel, QUESTION_PANEL); 

될 것이라고했다 모든 것을 QUESTION_PANEL이 que를 추가 할 때 사용 된 String 상수라고 가정하고 스왑을 표시하는 데 필요합니다. stionPanel을 mainPanel에 연결하고 mainPanel이 CardLayout을 사용하는 지 확인합니다. 예를 들어

: 모든의 validate 메소드를 실행해야하는 제거 방법 후

import java.awt.CardLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Random; 

import javax.swing.*; 

public class SwapPanels extends JPanel { 
    public static final String INTRO_PANEL = "intro panel"; 
    public static final String QUESTION_PANEL = "question panel"; 
    private static final int PREF_W = 500; 
    private static final int PREF_H = 400; 
    private CardLayout cardLayout = new CardLayout(); 
    private JPanel introPanel; 
    private JPanel questionPanel; 
    private Random random = new Random(); 

    public SwapPanels() { 
     introPanel = createPanel("Introduction"); 
     questionPanel = createPanel("Question"); 
     setLayout(cardLayout); 
     add(introPanel, INTRO_PANEL); 
     add(questionPanel, QUESTION_PANEL); 

     int delay = 3 * 1000; // show intro for 3 seconds 
     new Timer(delay, new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      cardLayout.show(SwapPanels.this, QUESTION_PANEL); 
      ((Timer) e.getSource()).stop(); 
     } 
     }).start(); 
    } 

    private JPanel createPanel(String title) { 
     int rgb = random.nextInt(); 
     Color color = new Color(rgb); 
     JPanel panel = new JPanel(new GridBagLayout()); 
     panel.setBorder(BorderFactory.createLineBorder(color, 60)); 
     panel.add(new JLabel(title)); 
     return panel; 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
     return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private static void createAndShowGui() { 
     SwapPanels mainPanel = new SwapPanels(); 

     JFrame frame = new JFrame("SwapPanels"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
+0

이것은 매우 흥미 롭습니다. 그리고 나는 그것을 테스트했고 실제로 작동합니다. 내 유일한 문제는 MiG 레이아웃을 사용하고 있다는 것입니다. 테스트를 위해 메인 패널에서 레이아웃을 제거했지만 완료 한 레이아웃을 다시해야합니다. 'CardLayout'으로 바꾸고 싶은 패널을 포장 한 다음 MiG를 사용하는 커스텀 패널을 추가 할 수 있을까요? – eignhpants

+0

@eignhpants : MigLayout 사용에는 아무런 문제가 없습니다. JPanel을 각각의 레이아웃을 사용하여 중첩하는 것이 일반적입니다. CardLayout을 사용하는 하나의 JPanel이 필요합니다. 즉, 스왑 된 구성 요소를 보유 할 것입니다. –

0

. 코드는 다음과 같습니다 :

public void switchPanel(){ 
    mainPanel.remove(introPanel); 
    mainPanel.add(questionPanel); 
    mainPanel.validate(); 
} 

희망이 있습니다. Salam

관련 문제