Java 如何用同一位置的另一个JPanel替换一个JPanel?
我有一个JFrame,大约有四个框架。在给定的操作之后,我想在相同的位置用另一个面板替换一个面板。我切换它们的方法如下所示(Java 如何用同一位置的另一个JPanel替换一个JPanel?,java,swing,user-interface,jpanel,layout-manager,Java,Swing,User Interface,Jpanel,Layout Manager,我有一个JFrame,大约有四个框架。在给定的操作之后,我想在相同的位置用另一个面板替换一个面板。我切换它们的方法如下所示(this对象是一个扩展了JFrame的类): 最初创建的窗口如下所示: mainPanel.add(titlePanel); mainPanel.add(sidePanel); mainPanel.add(introPanel); public void switchPanel(){ mainPanel.remove(introPanel); mai
this
对象是一个扩展了JFrame
的类):
最初创建的窗口如下所示:
mainPanel.add(titlePanel);
mainPanel.add(sidePanel);
mainPanel.add(introPanel);
public void switchPanel(){
mainPanel.remove(introPanel);
mainPanel.add(questionPanel);
mainPanel.validate();
}
你问:
如何用同一位置的另一个JPanel替换一个JPanel
非常简单:使用a,因为此工具就是为这种情况而构建的
如果您具有以下常量:
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);
假设将questionPanel添加到主面板时使用的questionPanel是字符串常量,并且主面板使用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();
}
});
}
}
在remove方法之后,您必须运行validate方法,仅此而已。代码如下所示:
mainPanel.add(titlePanel);
mainPanel.add(sidePanel);
mainPanel.add(introPanel);
public void switchPanel(){
mainPanel.remove(introPanel);
mainPanel.add(questionPanel);
mainPanel.validate();
}
我希望这有帮助。Salam这非常有趣,我对它进行了测试,它确实有效。我唯一的问题是我使用的是米格布局。我从主面板上删除了这个布局来测试这个,但是我必须重做我已经做过的很多布局。我是否可以将要交换的面板包装成
卡片布局
,然后添加使用MiG的自定义面板?@eignhpants:使用MigLayout没有问题,一点问题也没有。嵌套JPanel非常常见,每个都使用自己的布局。您只需要在某个地方使用一个使用CardLayout的JPanel,它将保存交换的组件,仅此而已。