Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di dash
    Registrato dal
    Jan 2008
    Messaggi
    46

    Problema eventi del menu

    Salve a tutti è da poco che sto programmando in Java e voglio proporvi questo problema in cui sono capitato e che non riesco a risolvere:

    codice:
    import javax.swing.*; 
    import java.awt.event.ActionListener; 
    import java.awt.event.ActionEvent;  
    
    public class ProjectApplication extends JFrame implements ActionListener {  	 	
    private JMenuItem New , Open , Save , Close , Line , Rect, Circle; 	
    private Model model; 	
    private View view; 	
    private Controller controller; 	 	
    
    public ProjectApplication() { 		
    Model model = new Model(); 	    
    View view = new View(model); 	    
    Controller controller = new Controller(model , view); 	    
    initMenu(); 	    
    add(view); 		
    pack(); 		
    setDefaultCloseOperation(EXIT_ON_CLOSE); 		
    setVisible(true); 	} 	 	
    
    public void initMenu() { 		
    JMenuBar menuBar = new JMenuBar(); 		
    JMenu drawMenu = new JMenu("Draw"); 		 		
    Line = new JMenuItem("Line"); 		
    Line.addActionListener(this); 		
    drawMenu.add(Line); 		
    Rect = new JMenuItem("Rect"); 		
    Rect.addActionListener(this); 		
    drawMenu.add(Rect); 		
    Circle = new JMenuItem("Circle"); 		
    Circle.addActionListener(this); 		
    drawMenu.add(Circle); 			
    menuBar.add(drawMenu); 		
    setJMenuBar(menuBar); 	 	     
    } 	  	
    
    public void actionPerformed(ActionEvent evt){ 		
    Object source = evt.getSource(); 		
    if(source.equals(Line)) { model.setState("line"); } 		
    else if(source.equals(Rect)) { model.setState("rect"); } 		
    else if(source.equals(Circle)) { model.setState("circle"); } 	
    } 	 	 	
    
    public static void main(String[] args){ 		
    new ProjectApplication(); 	
    } 
    }

    Ok, il programma compila senza errori e va in esecuzione, quando però clicco su una qualsiasi delle voci del menu (Line , Rect o Circle) ricevo l'errore :

    codice:
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 	
    at ProjectApplication.actionPerformed(ProjectApplication.java:64)
    .
    .
    .
    le linee incriminate sono 63, 64 e 65 a seconda di quale MenuItem si clicchi e corrispondono alle seguenti linee di codice:

    codice:
    if(source.equals(Line)) { model.setState("line"); } 		
    else if(source.equals(Rect)) { model.setState("rect"); } 		
    else if(source.equals(Circle)) { model.setState("circle"); }
    Se io però chiamo il metodo setState("qualsiasi stringa"); di model in altre classi in cui model è istanziato allo stesso modo, il metodo funziona perfettamente.

    Chiunque abbia qualche consiglio da darmi è sicuramente ben accetto! Grazie in anticipo, David.
    dash

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

    Re: Problema eventi del menu

    Originariamente inviato da dash
    codice:
    public class ProjectApplication extends JFrame implements ActionListener {  	 	
        private Model model; 	
    
        public ProjectApplication() { 		
            Model model = new Model();
    2 cose:

    1) Assegni al 'model' che è una variabile locale del costruttore, quindi il 'model' campo di istanza resta a null, causa della eccezione se tenti di invocarci sopra qualcosa.

    2) Quando si deve distinguere il "source" dell'evento, in genere è più che sufficiente basarsi sulla "identità" degli oggetti, cioè confrontare i reference.

    if (source == Line)
    ....

    Insomma, non c'è dubbio che il source è esattamente, proprio come identità dell'oggetto, uno degli oggetti su cui hai registrato il listener.
    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 L'avatar di dash
    Registrato dal
    Jan 2008
    Messaggi
    46
    Grazie mille della risposta, ho risolto, il problema era proprio in quella dichiarazione del model.

    Ora avrei un altro problema però ehehe
    Praticamente questo piccolo programma dovrebbe essere un semplice programma di grafica capace di disegnare linee, rettangoli e cerchi.

    Ora tutto funziona finchè si disegna la prima figura: si clicca uno dei pulsanti del menu Draw(Line, Rect o Circle), si ascoltano 2 click del mouse sull'area di disegno che individuano le coordinate della figura e poi questa si disegna tramite paintComponent(area di disegno).

    Bene, ora io vorrei che ad un successivo click su uno dei pulsanti del menu le informazioni contenute nel model si azzerassero cosi' da poter settare un nuovo stato e due nuove coordinate per poter poi disegnare un'altra figura.
    Ho provato facendo in modo che dopo il paintComponent tutte le informazioni sul model vengono settate a null, ma non risolvo niente anzi ho un eccezzione NullPointerException...

    qualche consiglio?? grazie.
    dash

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Originariamente inviato da dash
    Bene, ora io vorrei che ad un successivo click su uno dei pulsanti del menu le informazioni contenute nel model si azzerassero cosi' da poter settare un nuovo stato e due nuove coordinate per poter poi disegnare un'altra figura.
    Ho provato facendo in modo che dopo il paintComponent tutte le informazioni sul model vengono settate a null, ma non risolvo niente anzi ho un eccezzione NullPointerException...

    qualche consiglio?? grazie.
    Posta il nuovo codice che lancia l'eccezione

    Per cancellare puoi usare questo: http://download.oracle.com/javase/6/...0int,%20int%29

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.