Originariamente inviato da Salinas
Dimmi come si usa un CardLayout? Cos'è?
Esempio completo:
codice:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TestFrame extends JFrame implements PageController {
private Container contentPane;
private CardLayout cardLayout;
public TestFrame() {
super("Test");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setSize(400, 300);
cardLayout = new CardLayout();
contentPane = getContentPane();
contentPane.setLayout(cardLayout);
contentPane.add(new PrimaPagina(this), "pag1");
contentPane.add(new SecondaPagina(this), "pag2");
}
public void attivaPrimaPagina() {
cardLayout.show(contentPane, "pag1");
}
public void attivaSecondaPagina() {
cardLayout.show(contentPane, "pag2");
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new TestFrame().setVisible(true);
}
});
}
}
interface PageController {
void attivaPrimaPagina();
void attivaSecondaPagina();
}
class PrimaPagina extends JPanel {
private PageController pageCtrl;
public PrimaPagina(PageController pageController) {
pageCtrl = pageController;
setLayout(new FlowLayout());
setBackground(new Color(255, 192, 192));
JButton b = new JButton("Seconda pagina");
add(new JLabel("Prima pagina"));
add(b);
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
pageCtrl.attivaSecondaPagina();
}
});
}
}
class SecondaPagina extends JPanel {
private PageController pageCtrl;
public SecondaPagina(PageController pageController) {
pageCtrl = pageController;
setLayout(new FlowLayout());
setBackground(new Color(255, 255, 192));
JButton b = new JButton("Prima pagina");
add(new JLabel("Seconda pagina"));
add(b);
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
pageCtrl.attivaPrimaPagina();
}
});
}
}
In questo esempio i pulsanti per il cambio della pagina sono nei pannelli, quindi i pannelli dovrebbero "sapere" come cambiare pagina. Per evitare troppo accoppiamento tra i pannelli e il frame ho "disaccoppiato" la cosa definendo una interfaccia PageController che ha solo i due metodi per attivare una certa pagina. I pannelli quindi non "vedono" il TestFrame ma solo una semplice interfaccia.
Se i controlli (pulsanti o altro) per cambiare la pagina fossero fuori dai pannelli, pensa ad esempio ad un classico "wizard" con i pulsanti "Avanti" e "Indietro" messi comuni nel frame, allora sarebbe ancora più semplice, perché solo il frame deve controllare il cambio della pagina.
Non so quanto ti sia chiaro .... lo ripeto, è solo questione di "design" delle classi, sfruttare la OOP, "incapsulazione", "astrazione" e altro .....