你問:
如何用同一位置的另一個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();
}
});
}
}
這是非常有趣的,我測試了它,它確實工作。我唯一的問題是我正在使用米格佈局。我從主面板中刪除了這個佈局來測試這個,但是我必須重做我做過的很多佈局。我可以將我想要交換的面板換成「CardLayout」,然後添加使用MiG的自定義面板嗎? – eignhpants 2014-10-03 14:00:50
@eignhpants:使用MigLayout沒有問題,根本沒有問題。嵌套JPanel很常見,每個都使用自己的佈局。你只需要一個使用CardLayout的JPanel,就可以容納交換的組件,就是這樣。 – 2014-10-03 16:35:06