在 JFrame 上的 JPanel 之间切换

问题描述

目前仅出于测试目的,我想在每次单击 JFrame 时更改 JPanel。我正在循环浏览 3 个面板/页面,每个面板/页面都有其独特的背景颜色。

目前它会改变,但只在添加的第一个面板时绘制,否则显示认灰色。

代码

@Override
    public void mouseClicked(MouseEvent e) {
        mainFrame.changePage();
    }

public void changePage() {
    if(currentPage != null) {
        this.remove(currentPage);
    }
    currentPage = pages[pageNumber];
    this.add(currentPage);
    currentPage.setPage();
    super.repaint();
    pageNumber++;
    if(pageNumber > 2) {
        pageNumber = 0;
    }
}

解决方法

除了@camickr 的评论要使用 CardLayout,您还需要 revalidate。更改:

super.repaint();

revalidate();
,

编辑:由于@camickr 在下面提到我的代码不符合最佳实践,请参阅以下有关如何使用 CardLayout 的链接。

How to use CardLayout - The Java Tutorials

Associated Source


仅供测试使用

重点放在上面,这里是一些示例代码。这是生产级,只是一个不需要@camickr提到的CardLayout的POC。

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class FirstSwingExample {  
    
    public static void main(String[] args) {  
        Swinger s = new Swinger();
    }
  
}

class Swinger implements ActionListener {
    
    int currFrame = 1;
    JFrame f;
    JLabel lblPanelOne,lblPanelTwo,lblPanelThree;
    JPanel panelOne,panelTwo,panelThree;
    JButton b;
    
    public Swinger() {
        setup();
    }
    
    private void setup() {
        
        f=new JFrame();
        
        panelOne = new JPanel();
        lblPanelOne = new JLabel("Panel One");
        panelOne.setBounds(0,100,40);
        panelOne.setBackground(Color.BLACK);
        panelOne.add(lblPanelOne);
        
        
        panelTwo = new JPanel();
        lblPanelTwo = new JLabel("Panel Two");
        panelTwo.setBounds(0,40);
        panelTwo.setBackground(Color.BLUE);
        panelTwo.add(lblPanelTwo);
        
        panelThree = new JPanel();
        lblPanelThree = new JLabel("Panel Three");
        panelThree.setBounds(0,40);
        panelThree.setBackground(Color.GREEN);
        panelThree.add(lblPanelThree);
        
        b=new JButton("Panel Two");
        b.setBounds(130,40);
        b.setActionCommand("click");
        b.addActionListener(this);
        
        panelOne.setVisible(true);
        f.add(panelOne);
        f.add(b);

        f.setSize(400,500);  
        f.setLayout(null);  
        f.setVisible(true);
    }
    
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println(e.getActionCommand());
        if(e.getActionCommand().equals("click")) {
            switch(currFrame) {
                case 1:
                    panelOne.setVisible(false);
                    f.remove(panelOne);
                    panelTwo.setVisible(true);
                    f.add(panelTwo);
                    b.setText("Panel Three");
                    currFrame++;
                    break;
                
                case 2:
                    panelTwo.setVisible(false);
                    f.remove(panelTwo);
                    f.add(panelThree);
                    panelThree.setVisible(true);
                    b.setText("Panel One");
                    currFrame++;
                    break;
            
                default:
                    panelThree.setVisible(false);
                    f.remove(panelThree);
                    f.add(panelOne);
                    panelOne.setVisible(true);
                    b.setText("Panel Two");
                    currFrame = 1;
                    break;
            }
        }
    }
}