2014-10-02 68 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(); 
} 

我希望有所帮助。萨拉姆