Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    Errore imprevisto nell'implementazione di una DocumentListener

    Sto cercando di implementare la gestione di un evento di una casella di testo nel seguente modo:

    codice:
    /**
    	Crea un frame di ampiezza WIDTH ed altezza HEIGHT, acquisendo la risoluzione video
    	lo presenta a partire ad 1/4 delle sue coordinate.
    */
    class tesiFrame extends JFrame{
            
            //variabili posizione
            private double x1aw[]=new double[100];	//casuali
            private double y1aw[]=new double[100];
            private int xaw[]=new int[100];	//convertite
            private int yaw[]=new int[100];
            private int kaw; //indice
            
    	/**
    		Costruttore
    		@param takap rappresenta la lunghezza dell'area di lavoro
    		@param habap rappresenta l'altezza dell'area di lavoro
    		@param Np rappresenta il numero di nodi
    	*/
    	
    	public tesiFrame(int takap, int habap, int Np){
    	
    ...		
    		Container contentPane = getContentPane();	//contenitori di pannelli
    		
    		//rilevatore di eventi
    		listener = new NawFieldListener();
    		
    		//pannello di ricerca
    		JPanel bPanel = new JPanel();
    		nawField = new JTextField("00",3);
    		bPanel.add(nawField);
    		generaButton = new JButton("Genera");
    		bPanel.add(generaButton);
    		contentPane.add(bPanel, BorderLayout.NORTH);		
    		
    		//pannello grafo
    		clumpPanel panel = new clumpPanel(takaaw, habaaw, Naw, xaw, yaw, x1aw, y1aw);
    		contentPane.add(panel, BorderLayout.CENTER);
    		
    	}//tesiFrame
    	
    	/**
    		Imposta il numero di nodi sui valori memorizzati nel campo di testo
    	*/
    	public void setNodi(){
    		try{
    			//acquisisce quanto scritto ed elimina gli spazi vuoti
    			int num = Integer.parseInt(nawField.getText().trim());
    			clump.setNaw(num);
    		}catch(NumberFormatException e){
    			//non imposta il numero di nodi è errato
    			JOptionPane.showMessageDialog(null,"Devi inserire un numero intero!");
    		}//catch
    		
    	}//setNodi
    	
    	public static final int WIDTH = 500;	//Ampiezza Frame
    	public static final int HEIGHT = 400;	//Altezza Frame prima 350
    	
    	private clumpPanel clump;
    	private DocumentListener listener;	private JTextField nawField;
    	private JButton generaButton;
    	
    	/**
    		Quando il testo subisce modifiche, viene chiamato uno dei seguenti tre metodi.
    		I primi due metodi vengono chiamati se sono stati inseriti o eliminati caratteri.
    		Il terzo metodo non viene chiamato per i campi testo.
    	*/
    	private class NawFieldListener implements DocumentListener{
    		public void insertUpdate(DocumentEvent e){ setNodi(); }
    		public void removeUpdate(DocumentEvent e){ setNodi(); }
    		public void changeUpdate(DocumentEvent e){ }
    	}//NawFieldListener
    	
    }//tesiFrame
    in cui l'oggetto private clumpPanel clump usa il metodo clump.setNaw(num) così implementato:

    codice:
    /**
    	Un pannello che visualizza un grafo clump
    */
    class clumpPanel extends JPanel{
    
            private Color col1,col2,col3,col4;	//colori
            private double r;	//raggio
            private int k,l;	//indici
            private double Nd;	//numero nodi casuali
            private int Naw;	//numero nodi
            private int takaaw,habaaw;	//lunghezza area grafo, altezza area grafo
            private int kaw,iaw,jaw,i;	//indici
            //vettori posizione
            private double x1aw[]=new double[100];	//casuali
            double y1aw[]=new double[100];
            private int xaw[]=new int[100];	//convertiti
            private int yaw[]=new int[100];
            
            
    	/**
    		Costruttore
    		@param takap rappresenta la lunghezza dell'area di lavoro
    		@param habap rappresenta l'altezza dell'area di lavoro
    		@param Np rappresenta il numero di nodi
    	*/
    	public clumpPanel(int takap, int habap, int Np, int x[], int y[], double xc[], double yc[]){
    	
    	...
                    
    	}//clumpPanel
    	
                    
            /**
            	restituisce la distanza tra la differeza di due punti
            	@param d1 rappresenta un valore di tipo double identicato come un punto
            	@param d2 rappresenta un valore di tipo double identicato come un punto
            	@param d2 rappresenta un valore di tipo double identicato come un punto
            	@param d3 rappresenta un valore di tipo double identicato come un punto
            	@param d4 rappresenta un valore di tipo double identicato come un punto
            */
            public double d(double d1,double d2,double d3,double d4){
              ...
            }//d
            
    	/**
    		Disegna il grafo
    		@param g di tipo Graphics rappresenta un oggetto atto a disegnare immagini e testi
    	*/
    	public void paintComponent(Graphics g){
    		super.paintComponents(g);
                    
    		....
    
    	}//paintComponent
    	
    	/**
    		Imposta il numero di nodi e la loro posizione;
    		@param n numero di nodi
    	*/
    	public void setNaw(int num){
    		Naw = num;
    		if(Naw==20){		//se il numero di nodi è 20 genera un numero di nodi casuali
                      Nd=4+46*Math.random();
                      Naw=(int)Nd;	
                    }//if
                    
                    for(kaw=0;kaw<Naw;kaw++){
                      //posiziona i nodi nel piano in modo casuale
                      x1aw[kaw]=Math.random()*(habaaw-30)+15;
                      y1aw[kaw]=Math.random()*(takaaw-30)+15;
                      xaw[kaw]=(int)x1aw[kaw];
                      yaw[kaw]=(int)y1aw[kaw];
                    }//for kaw
                    
                    repaint();
    	}//setNaw
    	
    }//clumpPanel
    ma quando compilo il file mi viene visualizzato il seguente messaggio di errore:

    codice:
    C:\Documents and Settings\Giuseppe\Documenti\Java Source\tesiTest.java:145: tesiFrame.NawFieldListener is not abstract and does not override abstract method changedUpdate(javax.swing.event.DocumentEvent) in javax.swing.event.DocumentListener
    private class NawFieldListener implements DocumentListener{
    ^
    1 error
    Compilation interrupted
    N.B. Si tenga presente che l'implementazione della classe NawFieldListener è stata riprodotta sulla falsa riga di un esempio preso dal libro Java 2 - I Fondamenti della Mc Graw Hill.
    Giuseppe SPECCHIO

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    56
    Ti manca una d nel nome del metodo changeUpdate della classe NawFieldListener.
    L'interfaccia DocumentListener ha il metodo changedUpdate e non changeUpdate.

  3. #3
    avevi proprio ragione, bastava un poco + di attenzione, ma dopo tante ore al PC ti si annebbia anche la vista. A proprosito di eventi, sempre studiando dal libro in questione ho implementato una struttura di controllo eventi su un bottone la quale mi permette di verificare se in una casella di testo sia stato inserito un numero intero:

    codice:
    /**
    	Crea un frame di ampiezza WIDTH ed altezza HEIGHT, acquisendo la risoluzione video
    	lo presenta a partire ad 1/4 delle sue coordinate.
    */
    class tesiFrame extends JFrame{
            
            //variabili posizione
            private double x1aw[]=new double[100];	//casuali
            private double y1aw[]=new double[100];
            private int xaw[]=new int[100];	//convertite
            private int yaw[]=new int[100];
            private int kaw; //indice
            
    	/**
    		Costruttore
    		@param takap rappresenta la lunghezza dell'area di lavoro
    		@param habap rappresenta l'altezza dell'area di lavoro
    		@param Np rappresenta il numero di nodi
    	*/
    	
    	public tesiFrame(int takap, int habap, int Np){
    	
                    int Naw=Np;
                    int habaaw=habap;	
                    int takaaw=takap;	
            	        
    		[...]
    
    		Container contentPane = getContentPane();	//contenitori di pannelli
    		
    		[...]
    		
    		//pannello di ricerca
    		JPanel bPanel = new JPanel();
    		nawField = new IntTextField(20,3);
    		bPanel.add(nawField);
    		//nawField.getDocument().addDocumentListener(listener);
    		setButton = new JButton("Genera");
    		bPanel.add(setButton);
    		setButton.addActionListener(new ActionListener(){
    				public void actionPerformed(ActionEvent event){
    					if (nawField.isValid())
    						panel.setNaw(nawField.getValue());
    				}//actionPerformed
    			});//ActionListener
    		contentPane.add(bPanel, BorderLayout.NORTH);		
    		
    		//pannello grafo
    		panel = new clumpPanel(takaaw, habaaw, Naw, xaw, yaw, x1aw, y1aw);
    		contentPane.add(panel, BorderLayout.CENTER);
    		//contentPane.add(panel);
    		
    	}//tesiFrame
    	
           [...]
    	
    	public static final int WIDTH = 500;	//Ampiezza Frame
    	public static final int HEIGHT = 400;	//Altezza Frame prima 350
    	private clumpPanel panel;
    	[...]	
    	private IntTextField nawField;
    	private JButton setButton;
    	
    	private PrintWriter out;
    	private BufferedReader in;
    
    	[...]
    	
    }//tesiFrame
    la quale usa la classe IntTextField per gestire l'oggetto nawField. Tale classe si avvale di classi supplementari IntTextDocument e IntTextFieldVerifier, il tutto così implementato

    codice:
    /**
    	Un documento che piò contenere solo interi validi o loro
    	sottostringhe
    */
    class IntTextDocument extends PlainDocument{
    
    	public void insertString(int offs, String str, 
    		AttributeSet a) 
    		throws BadLocationException{
    		if (str == null) return;
    		
    		String oldString = getText(0, getLength());
    		String newString = oldString.substring(0, offs)+str+oldString.substring(offs);
    		
    		if (canBecomeValid(newString))
    			super.insertString(offs, str, a);
    	}//insertString
    	
    	/**
    		Una funzione di aiuto che controlla se la stringa è un
    		Intero valido
    		@param s una stringa
    		@return true se s è un intero valido
    	*/
    	public static boolean isValid(String s){
    		try{
    			Integer.parseInt(s);
    			return true;
    		}catch(NumberFormatException e){
    			return false;
    		}//catch
    	}//isValid
    	
    	/**
    		Una funzione di aiuto che controlla se una stringa è una
    		Sottostringa di un intero valido
    		@param s una stringa
    		@return true se s piò essere esteso a un intero valido
    	*/
    	public static boolean canBecomeValid(String s){
    		return s.equals("") || s.equals("-") || s.equals("s");
    	}//canBecomeValid
    }//IntTextDocument
    
    /**
    	Un campo di testo per editare valori interi
    */
    class IntTextField extends JTextField{
    	/**
    		Costruisce un IntTextField
    		@param defval il valore predefinito
    		@param size le dimensioni del campo
    	*/
    	public IntTextField(int defval, int size){
    		super(""+defval, size);
    		setInputVerifier(new IntTextFieldVerifier());
    		//	Document doc = getDocument();
    		//	doc.addUndoableEditListener(new UndoListener());
    	}//IntTextField
    	
    	protected Document createDefaultModel(){
    		return new IntTextDocument();
    	}//createDefaultModel
    	
    	/**
    		Controlla se il contenuto di questo campo è un intero valido.
    		@return true se il contenuto del campo è valido
    	*/
    	public boolean isValid(){
    		return IntTextDocument.isValid(getText());
    	}//isValid
    	
    	/**
    		Prende il valore numerico del contenuto del campo.
    		@param il numero che l'utente ha scritto nel campo o
    		0 se il contenuto del campo non è valido
    	*/
    	public int getValue(){
    		try{
    			return Integer.parseInt(getText());
    		}catch(NumberFormatException e){
    			return 0;
    		}//catch
    	}//getValue
    }//IntTextField
    
    /**
    	Un verificatore che controlla se il contenuto di un componente
    	di testo è un intero valido.
    */
    class IntTextFieldVerifier extends InputVerifier{
    	public boolean verify(JComponent component){
    		String text = ((JTextComponent)component).getText();
    		return IntTextDocument.isValid(text);
    	}//verify
    }//IntTextFielverifier
    alnalogamente al caso precedente, se l'utente dopo aver inserito un numero corretto nella casella di testo, clicca sul tasto 'Genera', dovrebbe essere visualizzato un nuovo grafico con i dati inseriti nella casella di testo:

    codice:
    /**
    	Un pannello che visualizza un grafo clump
    */
    class clumpPanel extends JPanel{
    
            private Color col1,col2,col3,col4;	//colori
            private double r;	//raggio
            private int k,l;	//indici
            private double Nd;	//numero nodi casuali
            private int Naw;	//numero nodi
            private int takaaw,habaaw;	//lunghezza area grafo, altezza area grafo
            private int kaw,iaw,jaw,i;	//indici
            //vettori posizione
            private double x1aw[]=new double[100];	//casuali
            double y1aw[]=new double[100];
            private int xaw[]=new int[100];	//convertiti
            private int yaw[]=new int[100];
            
    	/**
    		Costruttore
    		@param takap rappresenta la lunghezza dell'area di lavoro
    		@param habap rappresenta l'altezza dell'area di lavoro
    		@param Np rappresenta il numero di nodi
    	*/
    	public clumpPanel(int takap, int habap, int Np, int x[], int y[], double xc[], double yc[]){
    	
    		[...]
                    
    	}//clumpPanel
            
            /**
            	restituisce la distanza tra la differeza di due punti
            	@param d1 rappresenta un valore di tipo double identicato come un punto
            	@param d2 rappresenta un valore di tipo double identicato come un punto
            	@param d2 rappresenta un valore di tipo double identicato come un punto
            	@param d3 rappresenta un valore di tipo double identicato come un punto
            	@param d4 rappresenta un valore di tipo double identicato come un punto
            */
            public double d(double d1,double d2,double d3,double d4){
              double dw;
              //dw=jouaw(jouaw(d3-d1,2.0)+jouaw(d4-d2,2.0),0.5);
              dw=Math.pow(Math.pow(d3-d1,2.0)+Math.pow(d4-d2,2.0),0.5);
              //System.out.println("***DEBUG: d= "+dw);
              return dw;
            }//d
            
    	/**
    		Disegna il grafo
    		@param g di tipo Graphics rappresenta un oggetto atto a disegnare immagini e testi
    	*/
    	public void paintComponent(Graphics g){
    		super.paintComponents(g);
                    
    		[...]
    
    	}//paintComponent
    	
    	/**
    		Imposta il numero di nodi e la loro posizione;
    		@param n numero di nodi
    	*/
    
    	public void setNaw(int num){
    		Naw = num;
    		if(Naw==20){		//se il numero di nodi è 20 genera un numero di nodi casuali
                      Nd=4+46*Math.random();
                      Naw=(int)Nd;	
                    }//if
                    
                    for(kaw=0;kaw<Naw;kaw++){
                      //posiziona i nodi nel piano in modo casuale
                      x1aw[kaw]=Math.random()*(habaaw-30)+15;
                      y1aw[kaw]=Math.random()*(takaaw-30)+15;
                      xaw[kaw]=(int)x1aw[kaw];
                      yaw[kaw]=(int)y1aw[kaw];
                    }//for kaw
                    
                    repaint();
    	}//setNaw
    	
    	
    }//clumpPanel
    ma ciò non avviene poichè non riesco più a scrivere nella casella di testo!!!
    Giuseppe SPECCHIO

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.