有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何用处于相同位置的另一个JPanel替换一个JPanel?

我有一个JFrame,大约有四个框架。在给定的操作之后,我想在相同的位置用另一个面板替换一个面板。我切换它们的方法如下所示(this对象是一个扩展了JFrame的类):

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

最初创建的窗口如下所示:

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

共 (2) 个答案

  1. # 1 楼答案

    在remove方法之后,您必须运行validate方法,仅此而已。代码如下所示:

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

    我希望这有帮助。萨拉姆

  2. # 2 楼答案

    你问:

    How can I replace one JPanel with another JPanel in the same position?

    非常简单:使用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);
    

    假设将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();
             }
          });
       }
    }