Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [JAVA] Aprire un frame da un frame

    Ciao a tutti!
    Sto provando a scrivere il codice per un frame che tramite la pressione su un JButton apra un altro frame, non sapendo come fare ho cercato su questo forum, trovando una discussione simile a questa dove c'era scritto di fare più o meno così:
    codice:
    public class layout extends JFrame {
    	private frame3 reale;   // Un riferimento alla finestra secondaria
    ...
    
        class Receiver1 implements ActionListener {
    	public void actionPerformed(ActionEvent e) {
    
          reale = new frame3();
          reale.setVisible( true );
    
    			}
    		}
    ...
    ...e così ho fatto, ma il compilatore dice

    codice:
    layout.java:8: error: frame3 cannot be resolved to a type
    	private frame3 reale;   // Un riferimento alla finestra secondaria
    	        ^^^^^^
    layout.java: 117: error: frame3 cannot be resolved to a type
    	reale = new frame3();
    	^^^^^
    layout.java: 117: error: frame3 cannot be resolved to a type
    	reale = new frame3();
    	            ^^^^^^
    layout.java: 118: error: frame3 cannot be resolved to a type
    	reale.setVisible( true );
    	^^^^^
    4 problems (4 errors)
    non riesco a capire, da dove può scaturire quell'errore?
    La classe del secondo frame devo includerla in quella del primo?
    Gato

  2. #2
    Se Dichiari un attributo private come pretendi di averne visibilità dall'interno di un'altra classe! Una rinfrescatina riguardo ai modificatori ci starebbe bene.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  3. #3
    Forse hai ragione
    anche se credo che non sia li l'errore fondamentale..provo a fare qualche ricerca...
    Gato

  4. #4
    Dove si trova la classe frame3? La importi?

    P.S.
    I nomi delle classi dovrebbero iniziare sempre con le maiuscole. Non è obbligatorio, ma buona prassi.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  5. #5
    Trovato! Prima non importavo il frame richiamato, ma era semplicemente nella stessa cartella del frame che lo richiamava, pensavo che bastasse questo, mentre ora viene importato come package infatti ora funziona! Il problema ora però è che il frame precedente non si chiude..

    Il codice relativo all'ActionListener è questo:
    codice:
        class Receiver1 implements ActionListener {
    	public void actionPerformed(ActionEvent e) {
    
          reale = new frame3();
          reale.setVisible( true );
    
    			}
    		}
    Gato

  6. #6
    Ho provato scrivendo:
    codice:
        class Receiver1 implements ActionListener {
    	public void actionPerformed(ActionEvent e) {
    
          reale = new frame3();
          reale.setVisible( true );
    	layout.setVisible(false);//sia con setVisible(false); che con dispose();
    
    			}
    		}
    , ma in compilazione mi dice error: Cannot make a static reference to the non-static method setVisible(boolean) from the type Component
    Gato

  7. #7
    layout è una classe e non un'istanza (ritorniamo al discorso delle classi con l'iniziale maiuscola...vallo a capire che layout è una classe a non un'istanza!!!).

    Comunque non si può andare per tentativi, io consiglio prima lo studio teorico SERIO della programmazione OOP e poi la pratica.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  8. #8
    Purtroppo hai ragione satifal, me ne accorgo che faccio fatica senza aver studiato seriamente,ho seguito solo due corsi di java generale durante questo stage, ma devo imparare così purtroppo sennò son senza lavoro!

    Comunque ora provo, cambio le iniziali minuscole in maiuscole e istanzio la classe poi ti so dire...grazie mille per l'aiuto e la pazienza!
    Gato

  9. #9
    Ho provato scrivendo così:
    codice:
    import Frame3.*;
    
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    import javax.swing.*;
    import java.awt.*;
    
    public class Layout extends JFrame {
        private static final long serialVersionUID = 1L;
    	public Frame3 reale;
    
    ...
    
        class Receiver1 implements ActionListener {
    	public void actionPerformed(ActionEvent e) {
    
          reale = new Frame3();
          reale.setVisible( true );
    //	layout.setVisible(false);//Ho provato sia con setVisible che con dispose!
    	layout.dispose();
    			}
    		}
    
    	public static void main(String argv[]) {
    
    		layout nf = new Layout();
    	}
    }
    Ora il codice viene compilato, ma quando Layout richiama Frame3 non si chiude automaticamente, mentre quando chiudo uno dei due frames si chiudono entrambi...
    Gato

  10. #10
    Il problema è all'interno della inner class Receiver1 non hai visibilità dell'istanza di layout per cui una soluzione potrebbe essere quella di utilizzare ActionEvent e risalire al componente che ha generato l'evento e da questo al container che lo contiene. In alternativa puoi inserire un costruttore nella inner class Receiver1:

    codice:
    class Receiver1 implements ActionListener {
    
        private layout l;
    
        public Receiver1(layout l) {
            this.l = l;
        }
    
        public void actionPerformed(ActionEvent e) {
            reale = new frame3();
            reale.setVisible( true );
            l.setVisible(false);
        }
    }
    e nel punto in cui istanzi il listener Receiver1 che immagino sia nella classe layout fai:

    codice:
    new Receiver1(this);
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

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.