Páginas de JPane dentro de um JFrame

Estou tentando criar um JFrame com vários JPane como se fossem páginas, logo utilizando CardLayout para mostrar-los.
Gostaria de ver algum exemplo em código ou outro método para fazer isso.

Dê um “Rolê” neste projeto https://github.com/frmichetti/vlocadora-swing
Veja executando o mosaico de Títulos … imagino que deve ser próximo disso:
https://www.youtube.com/watch?v=tehe8jXZPsI&list=PLDzyDVZ4JbDje5SJ5goWP_UKQzGz4hBH1&index=5

Tenha como Exemplo este código:

1 curtida

Muito interessante esse projeto além de ser muito bem feito, porém estou querendo fazer com que cada JPanel seja uma página, assim o interior do JFrame seria completamente individual.

Por que você não usa jTabbedPane? Ou não resolveria seu problema?

Obrigado pela dica, realmente é quase desse jeito, mas sem aparecer opções de trocar de abas, pois eu iria fazer isso ao clicar em JButton.

Ah sim. Então o Cardlayout seria a solução.

Poderia me ajudar exemplificando o código?

Sim. Só um momento.

import java.awt.CardLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Exemplo {

public static void initComponents(){
    
    JPanel jpnl1 = new JPanel();
    JPanel jpnl2 = new JPanel();
    
    JButton jbtIr = new JButton("Ir para o painel de trás");
    //Troca de painel ao clicar
    jbtIr.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            jpnl1.setVisible(false);
            jpnl2.setVisible(true);
        }
    });
    JButton jbtVoltar = new JButton("Voltar para painel da frente");
    //Troca de painel ao clicar
    jbtVoltar.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            jpnl1.setVisible(true);
            jpnl2.setVisible(false);
        }
    });
    
    JPanel jpnlPrincipal = new JPanel(new CardLayout());
    jpnl1.add(jbtIr);
    jpnl2.add(jbtVoltar);
    
    jpnl1.setVisible(true);
    jpnl2.setVisible(false);
    
    jpnlPrincipal.add(jpnl1);
    jpnlPrincipal.add(jpnl2);
    
    JFrame jFrame = new JFrame("CardLayout");
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jFrame.add(jpnlPrincipal);
    jFrame.setSize(300, 300);
    jFrame.setVisible(true);
    
}


public static void main(String[] args) {
    initComponents();
}

}

Show caraa! Mas tem um problema o setVisible(), ele limita o projeto, pode me ajudar a trocar a visibilidade dos JPane por outra maneira?

Não entendi. Como assim limita?

Quero criar os JPane em classes distintas, assim o método setVisible() criaria um looping de chamada com instâncias

import java.awt.CardLayout;
import javax.swing.JFrame;

public class NovoClass extends JFrame {

    CardLayout card = new CardLayout();

    public NovoClass() {
        this.setSize(300, 300);
        this.setLayout(card);
        this.setResizable(false);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        card.addLayoutComponent(new NovoClass1().painel, "eu");
        card.addLayoutComponent(new NovoClass2().painel, "ae");
        card.show(getContentPane(), "ae");
    }

    public static void main(String[] args) {
        new NovoClass().setVisible(true);
    }
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;

public class NovoClass1 {

    JPanel painel = new JPanel();
    JButton jbtIr = new JButton("Ir para o painel de trás");

    public NovoClass1() {
        painel.setSize(300, 300);
        painel.setLayout(null);

        painel.add(jbtIr);
        new NovoClass().getContentPane().add(painel);

        jbtIr.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                painel.setVisible(false);
                new NovoClass2().painel.setVisible(true);
                System.out.println("hehauhe");
            }
        });
    }
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;

public class NovoClass2 {

    JPanel painel = new JPanel();
    JButton jbtVoltar = new JButton("Ir para o painel de voltar");

    public NovoClass2() {
        painel.setSize(300, 300);
        painel.setLayout(null);

        painel.add(jbtVoltar);
        new NovoClass().getContentPane().add(painel);

        jbtVoltar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                painel.setVisible(false);
                new NovoClass1().painel.setVisible(true);
                System.out.println("eahaeygaegyaegyaeyg");
            }
        });
    }
}

Assim cria esse erro:

Exception in thread "main" java.lang.StackOverflowError
	at sun.awt.Win32GraphicsConfig.getBounds(Native Method)
	at sun.awt.Win32GraphicsConfig.getBounds(Win32GraphicsConfig.java:222)
	at java.awt.Window.init(Window.java:505)
	at java.awt.Window.<init>(Window.java:537)
	at java.awt.Frame.<init>(Frame.java:420)
	at java.awt.Frame.<init>(Frame.java:385)
	at javax.swing.JFrame.<init>(JFrame.java:189)
	at NovoClass.<init>(NovoClass.java:10)
	at NovoClass1.<init>(NovoClass1.java:19)
	at NovoClass.<init>(NovoClass.java:17)
	at NovoClass1.<init>(NovoClass1.java:19)

Vou testar aqui.

1 curtida

Você está acessando os atributos das classes gerando novas instancias das mesmas. Sempre que você faz um “new NovoClass().getContentPane().add(painel)” você está criando um novo objeto NovoClass apenas para colocar um painel dentro dele. E o objeto NovoClass que você invoca no método principal não é o mesmo que você preencheu com um painel por mais que você adicione os paineis no construtor da classe. Essa criação toda de objetos acaba gerando o overflow. E se você usasse atributos estáticos nas classes?

1 curtida