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

    Dubbi su comportamento listener

    Sto imparando Java e ho provato a realizzare una prima applicazione grafica, questa:
    codice:
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.text.*;
    
    
    public class DFrame extends JFrame {
    									private int numero;
    									private int numerodoppio;
    									private JButton calcola = new JButton("Calcola");
    									private JTextField textFieldnum = new JTextField(2);
    									private JTextField textFielddop = new JTextField(3);
    									private JLabel
    											lNum = new JLabel("Numero ",JLabel.RIGHT),
    											lDoppio = new JLabel("Doppio ",JLabel.RIGHT);
    									private JPanel
    									        input = new JPanel(),
    									        output = new JPanel(),
    									        pulsanti = new JPanel();
    									public DFrame(){
    									        setTitle("Doppio");
    									        setDefaultCloseOperation(EXIT_ON_CLOSE);
    									        Container cp=getContentPane();//cp è il contenitore generale degli altri pannelli
    									        
    									input.setLayout(new FlowLayout());//Imposta il tipo di modello grafico
    									input.add(lNum);
    									input.add(textFieldnum);
    									
    									output.setLayout(new FlowLayout());//Imposta il tipo di modello grafico
    									output.add(lDoppio);
    									output.add(textFielddop);
    									
    									pulsanti.setLayout(new BorderLayout());
    									pulsanti.add(calcola, BorderLayout.CENTER);
    									
    									input.setBackground(Color.yellow);
    									output.setBackground(Color.green);
    									
    									cp.setLayout(new BorderLayout());
    									cp.add(input, BorderLayout.EAST);
    									cp.add(output, BorderLayout.WEST);
    									cp.add(pulsanti, BorderLayout.SOUTH);
    									
    									textFieldnum.addActionListener(new LeggiNumero());
    									calcola.addActionListener(new CalcolaDoppio());
    									pack();//Assegna le dimensioni minime alla finestra per contenere tutti gli elementi									
    									}
    									
    									class LeggiNumero implements ActionListener{
    																				public void actionPerformed(ActionEvent e){
    																															numero=Integer.parseInt(textFieldnum.getText());
    																															}
    																				}
    									
    									class CalcolaDoppio implements ActionListener{
    									public void actionPerformed(ActionEvent e){
    																				Doppio doppio = new Doppio(numero);
    																				numerodoppio=doppio.getDoppio();
    																				textFielddop.setText(String.valueOf(numerodoppio));
    																			  }
    									}
    									}
    che utilizza questo Main:
    codice:
    import java.awt.*;
    
    public class Main {
    
    	public static void main (String args[]) {
    											 DFrame finestra = new DFrame();
    											 Toolkit kit = finestra.getToolkit();
    											 Dimension dim = kit.getScreenSize();
    											 finestra.setBounds(dim.width/4, dim.height/4, dim.width/4, dim.height/4);
    											 finestra.setVisible(true);
    											 		
    	}
    }
    e questa classe:
    codice:
    class Doppio {
    			  private int numero;
    public Doppio (int numero){
    							this.numero=numero;							
    							}
    public int getDoppio (){
    							return(numero*2);							
    							}							
    }
    Ho compilato questi file tramite la IDE Geany su Ubuntu 10.04. Tutto viene compilato ma quando premo il pulsante calcola, invece che il doppio del numero inserito (che è l'obbiettivo del programma), mi appare 0. Sapreste per favore dirmi dove può essere l'errore?
    Grazie

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Potresti sistemare l'indentazione? Non si capisce nulla...
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    il problema è qui
    codice:
    public void actionPerformed(ActionEvent e) {
                Doppio doppio = new Doppio(numero);
                numerodoppio = doppio.getDoppio();
                textFielddop.setText(String.valueOf(numerodoppio));
            }
    istanzi doppio con numero (che vale 0) quindi alla fine tutto vale zero.
    Devi istanziare doppio in altro modo
    codice:
        class CalcolaDoppio implements ActionListener {
    
            public void actionPerformed(ActionEvent e) {
                numero = Integer.parseInt(textFieldnum.getText());
                Doppio doppio = new Doppio(numero);
                numerodoppio = doppio.getDoppio();
                textFielddop.setText(String.valueOf(numerodoppio));
            }
        }

  4. #4
    Io pensavo che doppio venisse inizializzata con la variabile numero, valorizzata dall'altro listener:
    codice:
    LeggiNumero implements ActionListener{	  
    public void actionPerformed(ActionEvent e){											numero=Integer.parseInt(textFieldnum.getText());
    }
    Sbaglio qualcosa?

  5. #5
    Scusatemi per l'indentazione ma fatti un po' di tentativi non riesco purtroppo a sistemarla meglio.

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    dovresti rivedere un po' i concetti di listener
    ActionListener lo puoi usare se scrivi il numero e premi ENTER, ma se devi comunque premere il bottone e leggere il valore mutato serve un change listener

  7. #7
    Originariamente inviato da 8bitmagictime
    Io pensavo che doppio venisse inizializzata con la variabile numero, valorizzata dall'altro listener:
    Il codice del metodo actionPerformed associato alla textField viene eseguito soltanto nel momento in cui scatta l'evento stesso. Nel caso di una textField, l'actionPerformed scatta quando premi INVIO. Se premi prima INVIO e poi clicchi sul pulsante, il tuo codice funziona. La soluzione proposta da valia resta la migliore: recuperi il valore contenuto nella textField ad ogni pressione del pulsante (e puoi anche togliere l'actionListener sulla textField).
    Al mio segnale... scatenate l'inferno!

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da 8bitmagictime
    Scusatemi per l'indentazione ma fatti un po' di tentativi non riesco purtroppo a sistemarla meglio.
    Beh... magari, invece di usare 9 TAB per indentare, usane solo uno...
    Io ho eliminato i TAB dalla mia vita per quanto riguarda il codice sorgente: faccio sempre trasformare dal mio editor i vari TAB in spazi (3 per la precisione, al massimo 4).


    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

  9. #9
    Vi ringrazio per i suggerimenti. In effetti premendo ENTER tutto funziona correttamente. Scusatemi ma essendo alle prime armi con Java non conoscevo l'esistenza di change listener.
    Grazie anche per i consigli su TAB e indentazione.

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.