2014-10-02 63 views
3

我有一個約四幀的JFrame。在給定的行動後,我想在同一個位置替換另一個面板。我切換他們的方法是這樣的(在this對象延伸JFrame類):如何用同一位置的另一個JPanel替換一個JPanel?

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

獨創窗口看起來是這樣的:

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

回答

7

你問:

如何用同一位置的另一個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); 

然後,你可以換用JPanels:

cardLayout.show(mainPanel, QUESTION_PANEL); 

將所有的人需要顯示交換,假設QUESTION_PANEL是添加該隊列時使用的字符串常量sPanel到mainPanel,並且mainPanel使用CardLayout。

例如:

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

這是非常有趣的,我測試了它,它確實工作。我唯一的問題是我正在使用米格佈局。我從主面板中刪除了這個佈局來測試這個,但是我必須重做我做過的很多佈局。我可以將我想要交換的面板換成「CardLayout」,然後添加使用MiG的自定義面板嗎? – eignhpants 2014-10-03 14:00:50

+0

@eignhpants:使用MigLayout沒有問題,根本沒有問題。嵌套JPanel很常見,每個都使用自己的佈局。你只需要一個使用CardLayout的JPanel,就可以容納交換的組件,就是這樣。 – 2014-10-03 16:35:06

0

你必須運行validate方法這一切remove方法之後。代碼將是這樣的:

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

我希望有所幫助。薩拉姆

相關問題