在 JFrame 上的 JPanel 之间切换

Switching between JPanels on a JFrame

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

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

代码:

@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 提到我下面的代码不符合最佳实践,请参考以下内容 link 如何使用 CardLayout。

How to use CardLayout - The Java Tutorials

Associated Source


just for testing purposes

继续强调上面的内容,这里有一些示例代码。这是 NOT 生产级,只是一个 POC,不需要 @camickr 提到的 CardLayout。

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,0,100, 40);
        panelOne.setBackground(Color.BLACK);
        panelOne.add(lblPanelOne);
        
        
        panelTwo = new JPanel();
        lblPanelTwo = new JLabel("Panel Two");
        panelTwo.setBounds(0,0,100, 40);
        panelTwo.setBackground(Color.BLUE);
        panelTwo.add(lblPanelTwo);
        
        panelThree = new JPanel();
        lblPanelThree = new JLabel("Panel Three");
        panelThree.setBounds(0,0,100, 40);
        panelThree.setBackground(Color.GREEN);
        panelThree.add(lblPanelThree);
        
        b=new JButton("Panel Two");
        b.setBounds(130,100,100, 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;
            }
        }
    }
}