Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    37

    Esercizio Difficile Awt...

    Salve a tutti, vorrei chiedervi consiglio su come completare questo es, che mi son ritrovato in una sessione d'esame (ahimè!), e non sono riuscito a risolverlo, nemmeno a casa consultando libri e slide sono riuscito a venirne a capo, mi manca poco, però quel poco è molto importante.

    Il testo dell'esercizio è il seguente;

    Data un interfaccia awt suddivisa in 2 pannelli, il primo in alto con una choice posizionata al centro(NORTH), con una textarea di 10 righe e 30 colonne sempre posizionata al centro ( del frame) e una textfield sul terzo pannello di 10 caratteri in posizionata centralmente in basso (SOUTH).

    Scrivere 2 classi:

    Una classe Esame che specifica i componenti dell'interfaccia come da figura. La Choice deve presentare come scelte i primi numeri naturali(1,2,3,...), come specificato da un parametro di tipo int passato al costruttore di Esame.

    ( Suggerimento: il metodo add della classe Choice viene usato per aggiungere le varie opzioni a una Choice; riceve come argomento una String; un modo per trasformare un int in una String è di concatenarlo con la stringa vuota.)


    codice:
    import java.awt.*;
    class Esame extends Frame{
      private Choice c = new Choice();
      private Panel p1= new Panel();
      private Panel p2 = new Panel();
      private TextArea t = new TextArea(10,30);
      private TextField tf = new TextField(10);
     
      public Esame(int[] ch) {
        super("Esame");
    	p1.add(c);
    	this.add(p1,BorderLayout.NORTH);	
             // array per convertire gli int in stringhe e buttarli in c...
    	for(int i = 0; i < ch.length; i++) {
    	this.c.add(" "+ch[i]);
    	}	
    	//tf.add(AscoltatoreTextField2(c,t)); 
           //Questo dovrebbe essere l'ascoltatore del textfield
           //( da assocciare a tf? oppure al frame? bho!)
    	this.add(t,BorderLayout.CENTER);
    	p2.add(tf);
    	this.add(p2,BorderLayout.SOUTH);
    	this.setVisible(true);
    	this.pack();
    } 
      public static void main(String[] args) {
    	  int[] ch = {1,2,3,4,5,6,23};
        Frame f = new Esame(ch);
      }
    }

    Questa è la prima parte e mi sono arrangiato abbastanza dai, il problema è sull'ascoltatore che non riesco ad associarlo al textfield...infatti una volta avviato l'awt dovrebbe generarmi una "moltiplicazione" tra quello che metto nella choice ( moltiplicatore) per il numero nell'textfield e stamparmelo sulla textarea...

    ovvero se:
    choice = 2;
    textField = 3;
    premo return e sulla textarea comparirà 6.



    Una classe Ascoltatore che deve essere associato al TextField e deve far si che quando l'utente preme return sul textField, il numero intero contenuto nel TextField viene moltiplicato per la scelta della Choice selezionata per ultima e il risultato visualizzato nella TextArea.

    (Suggerimento: il costruttore dell'ascoltatore dovrà avere 2 parametri, di tipo CHoice e TextArea. L'evento generato dal return sul TextField è di tipo ActionEvent. Choice ha un metodo d'istanza getSelectedIndex che restituisce l'indice della scelta correntemente selezionata(attenzione: la prima scelta corrisponde allo zero). Per trasformare uno String nell'int corrispondente si usi il metodo di classe Integer.parseInt(). Per visualizzare il risultato nella TextArea usate il metodo append(che come argomento vuole una String).


    codice:
    import java.awt.*;
    import java.awt.event.*;
    public class AscoltatoreTextField2 implements ActionListener {
    	private Choice c;
    	private TextArea t;
    		
    	public void AscoltatoreTextField2(Choice c, TextArea t) {
            this.c = c;
    	this.t = t;	
    	}  
    	
    	public void actionPerformed(ActionEvent Return) {
            int a = c.getSelectedIndex();
    	String s = (" +a");
            t.append("s");
    	}	  
    }
    Questo è l'ascoltatore (più o meno) diciamo che ho fatto meglio che ho potuto tuttavia so che è incompleto il metodo actionPerformed non funziona!!
    E dovrei riuscire a usare anche la chiamata Integer.parseInt().
    Come dice l'es, dovrei convertire 2 volte la choice da string a int e viceversa, in più usare l'append sulla textarea quando premo return....
    Ringrazio di cuore chiunque potrà aiutarmi a venire a capo di questo rompicapo!


    Da notare che un esercizio di tale complessità non è stato mai nè spiegato nè dato come es. durante il corso!
    Sarà, ma finché non funziona... non è migliorabile!

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Moderazione

    Come da regolamento, cerca di utilizzare dei titoli che facciano capire il contenuto della discussione...
    L'ho modificato io.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    37
    ehm, scusami...

    visto che l'argomento riguardava l'awt... avevo messo un titolo riguardante ciò...

    effettivamente la domanda si rivolge solamente agli ascoltatori :rollo:

    a forza di macinare codice non ragiono più...!!:master:

    nessuno ha qualche idea??

    aggiungo che non è previsto l'uso di swing e o di classi Jframe ( o derivate J... ) che poi non saprei nemmeno come si comportano in quanto non erano parte del corso... (uff..)..
    Sarà, ma finché non funziona... non è migliorabile!

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Al di là del fatto che il testo dell'esercizio diceva che il costruttore della finestra doveva essere un intero (come è logico che sia) e non un array di interi:

    codice:
    public Esame(int ch) {
       ...
       for(int i=0; i<ch; i++) {
          c.add("" + i);
       }
       ...
    }
    Il discorso dell'ascoltatore è più facile di quel che si crede. Va bene, infatti, utilizzare il metodo getSelectedIndex() di Choice (questo ti evita un'inutile conversione di una stringa in numero... ciascuna stringa rappresenta la posizione che occupa!); quello che va fatto è la conversione del valore immesso nella TextField in un numero intero (con i dovuti accorgimenti (se l'utente scrive "ciao", non va più bene...), quindi il prodotto con il valore ottenuto precedentemente ( getSelectedIndex() ) e la stampa nella TextArea.

    Quindi:

    codice:
    public void actionPerformed(ActionEvent ae) {
       // Dobbiamo ottenere l'oggetto che ha scatenato l'evento: la TextField
       TextField tf = (TextField) ae.getSource();
    
       int primoFattore = 0;
       int secondoFattore = 0;
       int risultato = 0;
    
       try {
    
          primoFattore = c.getSelectedIndex();
          secondoFattore = Integer.parseInt( tf.getText() );
          risultato = primoFattore * secondoFattore;
    
       } catch (NumberFormatException nfe) {
          // Se l'utente non ha scritto un numero, per me va tutto a 0
       }
    
       t.append("Risultato di " + primoFattore + " * " + secondoFattore + ": " + risultato);
    }
    Per aggiungere un ascoltatore alla TextField è sufficiente richiamare su di essa il metodo addActionListener(), nel costruttore di Esame:

    codice:
    public Esame( ... ) {
       ...
       tf.addActionListener( new AscoltatoreTextField2(c, t) );
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    37
    ma... ma.. son sicuro di aver fatto un errore stupidissimo... ma...

    ma l'avevi provato o l'hai fatto a mente??

    ho corretto tutte le parti che mi hai detto.. tuttavia ho un ultimo errore...

    codice:
    import java.awt.*;
    class Esame extends Frame{
      private Choice c = new Choice();
      private Panel p1= new Panel();
      private Panel p2 = new Panel();
      private TextArea t = new TextArea(10,30);
      private TextField tf = new TextField(10);
     
      public Esame(int ch) {
        super("Esame");
    	p1.add(c);
    	this.add(p1,BorderLayout.NORTH);	
        	
    	for(int i=0; i<ch; i++) {
        c.add("" + i);
        }
    
        tf.addActionListener(new AscoltatoreTextField2(c,t));
    
    	this.add(t,BorderLayout.CENTER);
    	p2.add(tf);
    	this.add(p2,BorderLayout.SOUTH);
    	this.setVisible(true);
    	this.pack();
    } 
      public static void main(String[] args) {
    	  int ch = 3;
        Frame f = new Esame(ch);
      }
    }
    Mi da errore esattamente sull'invocazione dell'ascoltatore TextField2... ( dice che non può trovare il simbolo...)

    Esame.java:19: cannot find symbol
    symbol : constructor AscoltatoreTextField2(java.awt.Choice,java.awt.Tex tArea)
    location: class AscoltatoreTextField2
    tf.addActionListener(new AscoltatoreTextField2(c,t));
    ^
    1 error
    Compilazione fallita.


    codice:
    import java.awt.*;
    import java.awt.event.*;
    public class AscoltatoreTextField2 implements ActionListener {
    
      private Choice c;
      private TextArea t;
      private TextField tf;
      
      public void AscoltatoreTextField2(Choice c,TextArea t) {
      this.c=c;
      this.t=t;
      }
      
      public void actionPerformed(ActionEvent ae) {
      // Dobbiamo ottenere l'oggetto che ha scatenato l'evento: la TextField
      TextField tf = (TextField) ae.getSource();
      int primoFattore = 0;
      int secondoFattore = 0;
      int risultato = 0;
      try {
          primoFattore = c.getSelectedIndex();
          secondoFattore = Integer.parseInt( tf.getText() );
          risultato = primoFattore * secondoFattore;
       } catch (NumberFormatException nfe) { // Se l'utente non ha scritto un numero, per me va tutto a 0
       }
       t.append("Risultato di " + primoFattore + " * " + secondoFattore + ": " + risultato);
       }
    }
    E questo invece è l'ascoltatore "rivisitato" come mi hai consigliato.. comunque sono quasi sicuro di aver fatto una grande "gaff" nel costruttore appunto...

    Tuttavia quest'ultimo in compilazione non mi segnala errore...

    E il costruttore però scritto così mi sembra ( oppure effettivamente lo è!) inutile... ?!

    Un ultimo suggerimento????? Mi riprometto di rileggermi tutto il capitolo sugli ascoltatori!
    Sarà, ma finché non funziona... non è migliorabile!

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    No, non l'ho provato, ho solo guardato il codice che hai postato tu
    Il problema è che tu non hai definito un costruttore... hai definito un metodo: probabilmente mi era sfuggito.

    Un costruttore si definisce come un metodo, che ha lo stesso nome della classe, senza alcun tipo di ritorno:

    codice:
    public class AscoltatoreTextField2 implements ActionListener {
    
      private Choice c;
      private TextArea t;
      private TextField tf;
      
      public AscoltatoreTextField2(Choice c,TextArea t) {   // <-- senza void
         this.c=c;
         this.t=t;
      }

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    37
    Grazie mille, ci stavo da giorni.... ho risolto...
    Sarà, ma finché non funziona... non è migliorabile!

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.