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

    JTextField non prende input

    Salve a tutti, sono 2 giorni che mi sbatto su questo codice, e non riesco a risolvere un problema:

    in pratica ho un'interfaccia semplice, con un Jtextfield, un bottone, ed un Jlabel, che dovrebbero prendere il contenuto del TextField, farne un'analisi, per vedere ad esempio se è palindorma, o meno, e stampare nel Jlabel, il risultato.

    l'asino casca nel momento in cui faccio il getText() del JTextField, poiché mi prende solo l'input iniziale di default, e se modifico il testo, non me lo prende... Che cosa devo fare?
    Premetto che nel codice c'è una bozza di observer che stavo implementando, ma, dato che non riesco a risolvere questo problema, non so come concludere.


    codice della classe del textfield
    codice:
    public class PannelloInput extends JTextField implements IPrendiTesto{
    
    private static final long serialVersionUID = 0; 
    private String testo; 
    
      public PannelloInput() { 
       
             super("itopinonavevanonipoti"); 
      }
    
      public String getTesto() {
             return this.getText(); 
      }
    
      public char[] getCaratteri() { 
             return this.getText().toCharArray(); 
      }
    
    
    }
    codice della classe del Jbutton
    codice:
    public class PannelloRisposte extends JPanel implements Observer{ 
    
    private static final long serialVersionUID = 0L; 
    private Palindromia pal= new Palindromia(); 
    private ProxyElaboratore elaboratore= new ProxyElaboratore(pal); 
    private JButton button; 
    private JLabel label= new JLabel(); 
    
      public PannelloRisposte() { 
          setLayout(new BorderLayout()); 
          label.setPreferredSize(new Dimension(100, 100)); 
          button=new JButton("Verifica!"); 
          add(label, BorderLayout.SOUTH); 
          add(button, BorderLayout.NORTH); 
          
          button.addActionListener(new ActionListener() { 
             @Override 
             public void actionPerformed(ActionEvent arg0) { 
             System.out.println("sì3"); 
             label.setText(elaboratore.risolvi(elaboratore.getCaratteri())); 
             System.out.println("sì4"); 
             } 
          
          });
    
       }
    
    }
    ---nothing to say---

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Se stampi in console il valore di ritorno di getText ottieni quello che ti aspetti?
    Perché fai override di metodi senza cambiare nulla?

  3. #3
    Se stampi in console il valore di ritorno di getText ottieni quello che ti aspetti?
    No, ritorna sempre il valore di default, anche se cambio il testo all'interno del field

    Perché fai override di metodi senza cambiare nulla?
    Perché ho implementato un'interfaccia, con cui passo il metodo getText(), proprio del TextField, al PannelloRisposte, dove ho il jbutton ed il label
    ---nothing to say---

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Il funzionamento quindi dovrebbe essere il seguente?

    Nel JTextField scrivo la frase, il bottone la "invia" per il controllo, ed il JLabel indica il risultato. E' così?

  5. #5
    Esattamente quello, ma il problema è che nonostante il cambiamento della frase di default, il programma prende sempre e solo quel valore! ( ho provato a non mettere la frase di default, il risultato nn cambia, mi risulta che non ho input)
    ---nothing to say---

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Com'è definita la classe ProxyElaboratore? Perché vedo che nell'ascoltatore prendi una frase tramite quella...

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Già, all'interno di actionPerformed() prendi sempre i dati presenti nell'oggetto elaboratore (ProxyElaboratore); l'oggetto inoltre non è corretto crearli li fuori, andrebbe istanziato all'interno del costruttore, ma se ogni volta nel costruttore ci deve essere un nuovo dato, devi creare l'istanza da un altra parte.

  8. #8
    Com'è definita la classe ProxyElaboratore? Perché vedo che nell'ascoltatore prendi una frase tramite quella...
    questo è il proxy:
    codice:
    public class ProxyElaboratore extends Observable implements IElaboratore{
    
    	private IElaboratore elaboratore;
    	
    	public ProxyElaboratore(IElaboratore elaboratore) {
    		super();
    		this.elaboratore=elaboratore;
    	}
    	
    	@Override
    	public char[] getCaratteri() {
    		// TODO Auto-generated method stub
    		return elaboratore.getCaratteri();
    	}
    	
    	@Override
    	public String getTesto() {
    		// TODO Auto-generated method stub
    		return elaboratore.getTesto();
    	}
    	
    	@Override
    	public String risolvi(char[] caratteri) {
    		// TODO Auto-generated method stub
    		return elaboratore.risolvi(caratteri);
    	}
    	
    	public void update(){
    		
    		setChanged();
    		notifyObservers();
    		
    	}
    	
    }


    Questa è l'interfaccia Elaboratore:

    codice:
    public interface IElaboratore {
    
    	public abstract String risolvi(char[] caratteri);
    
    	public abstract String getTesto();
    
    	public abstract char[] getCaratteri();
    
    }
    se vi può essere più chiaro, carico anche l'uml del progetto:






    Già, all'interno di actionPerformed() prendi sempre i dati presenti nell'oggetto elaboratore (ProxyElaboratore);
    Ok fin qui ci sono...

    l'oggetto inoltre non è corretto crearli li fuori, andrebbe istanziato all'interno del costruttore, ma se ogni volta nel costruttore ci deve essere un nuovo dato, devi creare l'istanza da un altra parte.
    mi sono perso, potresti spiegarti meglio?

    Grazie a tutti dell'aiuto!
    ---nothing to say---

  9. #9
    Risolto il problema!

    In pratica effettuavo un cattivo istanziamento dell'oggetto, proprio come diceva Patrick Jane;
    adesso ho capito a cosa ti riferivi dicendo che dovevo istanziarlo da un altra parte!


    Grazie a tutti dell'aiuto!!!
    ---nothing to say---

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Le inizializzazioni vengono fatte all'interno del costruttore. Nel tuo caso però (visto come funziona la classe) devi creare un nuovo oggetto ogni volta (mi sembra dispendioso comunque...); quindi devi creare l'oggetto in un metodo, per poter passare il nuovo valore come parametro. ^^

    Prego

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.