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:
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.
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?