Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2014
    Messaggi
    40

    Problema con template method e GUI

    ho creto una classe astratta che estende JWindow con dentro i vari component...
    qui:
    codice:
    public abstract class AbstractView extends JWindow implements WindowInterface {
        
        private Music music;
        private JLabel titleLbl; 
        private static JPanel panel;
        private JLabel gif1;
        
    
        public AbstractView(){
            setMusic(music);
            setSize(500,431);
            setLocation(400, 150);
            setAlwaysOnTop(true);
            getContentPane().setLayout(new CardLayout(0, 0));
            getContentPane().add(initView());
            setVisible(true);
        }
        /**
         * @return music
         */
        protected Music getMusic() {
            return music;
        }
    
        /**
         * @param music music da impostare
         */
        protected void setMusic(Music music) {
            this.music = music;
        }
    
        public Component initView(){
            this.setLayout(new CardLayout(0,0));
            titleLbl = new JLabel(new ImageIcon(tetrisAttack.Application.class.getResource("text.gif")));
            titleLbl.setBounds(6, 10, this.getWidth(),88);
            gif1 = new JLabel(new ImageIcon(tetrisAttack.Application.class.getResource("1.gif")));
            gif1.setBounds(0,0,500,431);
            this.add(this.createMenu());
            this.add(gif1);
            return this;
        }
        
        protected abstract Component createMenu();
    }
    nel metodo this.add(this.createMenu()); dichiarato sotto astratto,ho crato poi due specializzazioni che implementano tale metodo in due modi diversi,quando però le inizializzo la compilazione riporta questo errore Exception in thread "main" java.lang.IllegalArgumentException: adding container's parent to itself cosa vuol dire?
    Ultima modifica di alka; 06-04-2014 a 11:51

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da shaun87 Visualizza il messaggio
    nel metodo this.add(this.createMenu()); dichiarato sotto astratto,ho crato poi due specializzazioni che implementano tale metodo in due modi diversi,quando però le inizializzo la compilazione riporta questo errore Exception in thread "main" java.lang.IllegalArgumentException: adding container's parent to itself cosa vuol dire?
    Il problema della eccezione è facile da capire, in initView() fai un:

    return this;

    Qui this è la istanza del tuo AbstractView (il JWindow). E nel costruttore fai:

    getContentPane().add(initView());

    Ovvero la tua finestra cerchi di aggiungerla dentro il content-pane che è a sua volta contenuto nella finestra. Ovviamente non ha senso ....

    Ma a parte questo il tuo codice mostra cose dubbie/inutili. Innanzitutto setti 2 volte il CardLayout. Poi usi dei setBounds. I setBounds usati così direttamente sui componenti sono inutili se c'è un layout manager. Infatti è il layout manager che usa setBounds (o setLocation+setSize) per posizionare e dimensionare i componenti secondo i suoi criteri.

    Inoltre CardLayout si usa per "switchare" tra più componenti facendone vedere sempre e solo uno per volta. Ma per farlo bisogna dare un "nome" ai componenti. Con CardLayout si usa tipicamente il add() sul contenitore che ha anche un secondo argomento ovvero il "constraint" per CardLayout passando tipicamente una stringa:

    contenitore.add(card1, "nome-per-card1");

    Poi per switchare basta fare:

    ilCardLayout.show(contenitore, "nome-per-card1");

    Quindi onestamente ti suggerirei di approfondire meglio Swing, componenti/contenitori, layout manager, ecc... prima di "buttarti" su qualcosa di complesso come mi sembra di capire che stai cercando di fare ....
    Ultima modifica di andbin; 05-04-2014 a 16:27
    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
    Feb 2014
    Messaggi
    40
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Il problema della eccezione è facile da capire, in initView() fai un:

    return this;

    Qui this è la istanza del tuo AbstractView (il JWindow). E nel costruttore fai:

    getContentPane().add(initView());

    Ovvero la tua finestra cerchi di aggiungerla dentro il content-pane che è a sua volta contenuto nella finestra. Ovviamente non ha senso ....

    Ma a parte questo il tuo codice mostra cose dubbie/inutili. Innanzitutto setti 2 volte il CardLayout. Poi usi dei setBounds. I setBounds usati così direttamente sui componenti sono inutili se c'è un layout manager. Infatti è il layout manager che usa setBounds (o setLocation+setSize) per posizionare e dimensionare i componenti secondo i suoi criteri.

    Inoltre CardLayout si usa per "switchare" tra più componenti facendone vedere sempre e solo uno per volta. Ma per farlo bisogna dare un "nome" ai componenti. Con CardLayout si usa tipicamente il add() sul contenitore che ha anche un secondo argomento ovvero il "constraint" per CardLayout passando tipicamente una stringa:

    contenitore.add(card1, "nome-per-card1");

    Poi per switchare basta fare:

    ilCardLayout.show(contenitore, "nome-per-card1");

    Quindi onestamente ti suggerirei di approfondire meglio Swing, componenti/contenitori, layout manager, ecc... prima di "buttarti" su qualcosa di complesso come mi sembra di capire che stai cercando di fare ....
    grazie il fatto è che i component me li mette dove vuole lui invece io li volevo mettere in modo preciso come pareva a me quindi dici che dovrei mettere solo la add(comp)?

    ad esempio nella view del progetto(un gioco)volevo mettere le scritte come in quest'immagine e pensavo che il cardlayout fosse l'unica possibilità
    https://www.google.it/search?q=tetri...ck%3B512%3B448
    Ultima modifica di shaun87; 05-04-2014 a 18:53

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2014
    Messaggi
    40
    Lasciando perdere il template come dovrei fare per evitare di scrivere setBounds e mettere i Component dove voglio io?

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da shaun87 Visualizza il messaggio
    come dovrei fare per evitare di scrivere setBounds e mettere i Component dove voglio io?
    O usi la tecnica del posizionamento "assoluto", quindi niente layout manager e setBounds/setLocation+setSize sui componenti ..... oppure sfrutti i layout manager ma devi comprenderli, almeno quelli più basilari.
    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.