Pagina 1 di 7 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 62
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    396

    pulsante cambia schermata

    Ciao, mi puoi far vedere come posso far cambiare pagina ad un pulsante?
    So che bisogna assegnargli un actionevent o listner, ma non so quale sia il comando da scrivere per fargli caricare una nuova pagina nella stessa posizione di quella corrente.

    Per esempio:
    se mi torvo nella pagina iniziale di benvenuto e premo il pulsante entra,mi carica la pagina principale al posto di quella in cui ero.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: pulsante cambia schermata

    Originariamente inviato da Salinas
    come posso far cambiare pagina ad un pulsante?
    Intanto bisogna vedere cosa intendi per "pagine" ..... più pannelli (es. JPanel) che "scambi" mostrandone di volta in volta sempre solo 1 a video??
    Si può fare .... e oltretutto in diversi modi. Quindi .... ci sono un po' di cose da valutare ...
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    396
    Non voglio cambiare solo un JPanel, facendo sovrascrivere una nuova immagine al posto di quella attuale.
    Voglio proprio che si applichi una nuova finestra (JFrame) al posto di quella corrente.
    Come succede per le pagine web.
    In pratica devo passare ad un'altra pagina senza dover aprirla in una nuova finestra, ma in quella attuale.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Salinas
    Voglio proprio che si applichi una nuova finestra (JFrame) al posto di quella corrente.
    [...]
    senza dover aprirla in una nuova finestra
    Ma hai appena detto due cose opposte, in contrapposizione .... prima dici che vuoi una "nuova finestra" e poi dici "senza dover aprirla in una nuova finestra".
    Ma lo fai apposta a spiegarti male???

    Se vuoi tenere sempre quello stesso preciso JFrame e cambiare "pagina" internamente allora come ho detto prima devi per forza scambiare un qualche componente interno, tipicamente si usano dei JPanel.
    Se vuoi cambiare proprio JFrame, ne nascondi uno e ne mostri un altro.

    Insomma ... o hai diversi JFrame o hai diversi componenti che scambi in un unico JFrame.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    396
    No, mi viene spontaneo

    Ok, allora lasciamo sempre lo stesso frame iniziale e cambiamo tutti i pannelli,bottoni,...ecc che sono contenuti al suo interno. In questo modo l'effetto è quello di cambiare pagina....

    Come posso fare?

    Io vorrei impostarmi a parte tutte le varie pagine che si susseguono alla pressione dei bottoni e poi applicare una o l'altra a seconda del bottone premuto.

    E' possibile fare questo mantenendo lo stesso JFrame? Non credo... forse è meglio adottare il tuo metodo di metterli visibili e non visibili.
    Ma in questo modo non si nota minimamente che ho aperto una nuova finestra? no?
    La finestra che rendo visibile al posto di quella attuale si adatta perfettamente alla schermata aperta in precedenza, vero?

    Come vedi ho un po di confusione....tu che mi consigli di fare?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Salinas
    Come posso fare?
    Se tieni un unico JFrame, l'utente vede sempre e solo quella finestra "fisica" e cambia esclusivamente il suo contenuto.

    Gli approcci sono diversi:

    a) In un "contenitore" che ha un CardLayout metti tutti gli N componenti nel contenitore e poi mostri quello che vuoi usando show() di CardLayout. CardLayout come puoi intuire è un layout manager che mostra sempre solo 1 tra N componenti. È fatto apposta solo per questo ....

    b) Gestisci tu lo scambio dei componenti. E qui si può fare in svariati modi a seconda dell'uso o no di un layout manager.
    - Se non usi un layout manager (cioè posizioni/dimensioni in modo "assoluto" i componenti) puoi "giocare" sulla visibilità. Li metti tutti virtualmente sovrapposti e poi usi appropriatamente setVisibile con true/false per nasconderne uno e visualizzarne un altro.
    - Se usi un layout manager, se consente di posizionare i componenti virtualmente sovrapposti potresti "giocare" anche qui sulla visibilità. Altrimenti dovresti rimuovere effettivamente un componente dal contenitore e poi aggiungerne un altro. Ma devi anche "rivalidare" il layout (perché cambi il layout dopo che il contenitore è già visibile). Tipicamente basta un validate() sul container, almeno per i layout manager più semplici.

    Alla fin fine per l'approccio b) o giochi sulla visibilità dei componenti (tutti sempre contenuti in un contenitore) o giochi sul rimuovere/aggiungere componenti in un contenitore.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    396
    Mantenere tutti gli elementi in una solo schermata per poi farli visualizzare un po alla volta mi risulta un pochino complicato, anche perchè dovrei tenere tanti bottoni e pannelli tra i piedi e dover impostare la visibilità di ogniuno, volta per volta, in più mi risulta difficile gestirli con il layout manager.

    Come posso far aprire nuovi JFrame al posto di quello corrente in modo da aprire il programma in una nuova finestra quando i pulsanti e l'impaginazione cambiano?
    Naturalmente l'effetto deve far sembrare che si tratti sempre della stessa finestra che però in realtà è cambiata.

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Salinas
    Mantenere tutti gli elementi in una solo schermata per poi farli visualizzare un po alla volta mi risulta un pochino complicato, anche perchè dovrei tenere tanti bottoni e pannelli tra i piedi e dover impostare la visibilità di ogniuno, volta per volta, in più mi risulta difficile gestirli con il layout manager.
    No ... forse non ci siamo capiti .... (o forse non hai ancora colto le reali possibilità ....).
    Le soluzioni sono diverse, la più semplice e pulita è usare un CardLayout. Ti basta solo fare le cose "bene" e cioè ragionando in una ottica OOP dovresti semplicemente "incapsulare" la gestione di un pannello in una apposita classe. Quindi avrai classi es. PrimoPannello, SecondoPannello ecc...
    La questione è appunto proprio solo di "design", stabilire chi e a che livello deve "sapere" come far cambiare il pannello corrente.

    Originariamente inviato da Salinas
    Come posso far aprire nuovi JFrame al posto di quello corrente in modo da aprire il programma in una nuova finestra quando i pulsanti e l'impaginazione cambiano?
    Naturalmente l'effetto deve far sembrare che si tratti sempre della stessa finestra che però in realtà è cambiata.
    A dire il vero non sarebbe proprio la soluzione più bella.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    396
    Le soluzioni sono diverse, la più semplice e pulita è usare un CardLayout
    Dimmi come si usa un CardLayout? Cos'è?

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    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 .....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.