Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di Poker1
    Registrato dal
    Jul 2002
    Messaggi
    479

    [JAVA] Problema con una interfaccia swing

    ciao a tutti, sto facendo un esercizio da un libro molto semplice che dice di "simulare la crescita di una popolazione di trote", cioe' ogni volta che viene premuto il tasto di raddoppiare la popolazione, io ho questi 2 file:
    codice:
    public class TroteListener implements ActionListener
    {
    	public TroteListener()
    	{
    		popolazione = 2;
    	}
    
    	public void actionPerformed( ActionEvent event )
    	{
    		popolazione = popolazione * 2;
    		label.setText( "Popolazione " + popolazione );
    	}
    	
    	private int popolazione;
    }
    e la funzione contenente il main:
    codice:
    import java.awt.event.*;
    
    import javax.swing.*;
    
    public class TroteTester 
    {
    	public static void main( String args[] )
    	{
    		JFrame frame = new JFrame();
    		JButton pulsante = new JButton( "Passa 1 mese");
    		
    		JLabel label = new JLabel("Popolazione 2");
    		
    		JPanel panel = new JPanel();
    		
    		panel.add( pulsante );
    		panel.add( label );
    		frame.add( panel );
    		
    		
    		ActionListener listener = new TroteListener();
    		pulsante.addActionListener( listener );
    		
    		frame.setSize( 200, 100 );
    		frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    		frame.setVisible( true );
    	}
    
    }
    nella mia funzione actionPerformed io devo oltre che raddoppiare la popolazione, aggiornare anche l'etichetta col nuovo dato, il mio problema e' questo. Come faccio a passargli l'etichetta che ho dichiarato nel main? Se questa classe io la realizzo come classe interna nel main non ho problemi, ma cosi' in 2 file separati non riesco a capire come posso passargli label.

    grazie :-)
    Non riscrivere la ruota, usa le librerie.
    by Bjarne Stroustrup
    EIDON SOFT MEMBER

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Allora, è un po' male organizzato, nel senso che sarebbe meglio far estendere JFrame alla classe TroteTester e creare un costruttore che inizializzi la parte grafica. Nel main crei semplicemente l'istanza della classe TroteTester.

    Inoltre, c'è da passare un riferimento a TroteTester alla tua classe TroteListener, in modo che diventi una cosa del genere:

    codice:
    public class TroteListener implements ActionListener
    {
            TroteTester tt;
    	public TroteListener(TroteTester tt)
    	{
                    this.tt = tt;
    		popolazione = 2;
    	}
    
    	public void actionPerformed( ActionEvent event )
    	{
    		popolazione = popolazione * 2;
    		tt.label.setText( "Popolazione " + popolazione );
    	}
    	
    	private int popolazione;
    }
    che richiamerai da TroteTester così:

    codice:
    ActionListener listener = new TroteListener(this);
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Utente di HTML.it L'avatar di Poker1
    Registrato dal
    Jul 2002
    Messaggi
    479
    Allora, parto da un altro esercizio che e' piu facile, qui ho un programma che semplicemente crea una finestra con un bottone ed, ogni volta che si preme il bottone aumenta un capitale di un certo interesse, e' molto semplice:
    codice:
    public class InvestimentViewer1 
    {
    	public static void main( String args[] )
    	{
    		JFrame frame = new JFrame();
    		JButton button = new JButton("Add Interest");
    		final BankAccount account = new BankAccount(INITIAL_BALANCE);
    		
    		final JLabel label = new JLabel( "balance = " + account.getBalance() );
    		
    		JPanel panel = new JPanel();
    		panel.add( button );
    		panel.add(label);
    		frame.add(panel);
    		
    		class AddInterestListener implements ActionListener
    		{
    			public void actionPerformed( ActionEvent event)
    			{
    				double interest = account.getBalance() + INTEREST_RATE / 100;
    				account.deposit( interest );
    				label.setText( "balance = " + account.getBalance() );
    				
    			}
    		}
    		
    		ActionListener listener = new AddInterestListener();
    		button.addActionListener(listener);
    		
    		frame.setSize( 300, 100);
    		frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE);
    		frame.setVisible( true);
    	}
    	
    	public static final double INTEREST_RATE = 10;
    	public static final double INITIAL_BALANCE = 1000;
    
    }
    Ora in un esercizio dice di fare la classe interna come classe separata, vi riporto il testo:

    " Realizzate la classe AddInterestListener del programma InvestmentViewer in modo che sia una classe normale, anziche' una clase interna. Suggerimento: inserite nel ricevitore un riferimento al conto bancario e all'etichetta, e aggiungete al ricevitore un costruttore che imposti tali riferimenti."

    Ora, in un capitolo del libro dice di non usare dei contenitori come ricevitori di eventi, ma di lasciare sempre le classi che realizzano gli eventi come a se stanti, fa questo esempio di cattivo uso
    codice:
    public class InvestimentViewer implements ActionListener
    {
       public InvestimentViewer()
       {
          JButton button = new JButton("Add Interest");
          button.addActionListener(this);
       }
       public void actionPerformed(ActionEvent event
       {
        ...
       }
    }
    Ora non ci sono altri esempi qua che spieghino come passare questi "riferimenti", realizza tutto come classi interne e di conseguenza io non so come fare questa classe separata visto che devo usare la variabile account e la variabile label in un altra classe, e non come classe interna
    Non riscrivere la ruota, usa le librerie.
    by Bjarne Stroustrup
    EIDON SOFT MEMBER

  4. #4
    Utente di HTML.it L'avatar di Poker1
    Registrato dal
    Jul 2002
    Messaggi
    479
    Ho risolto cosi', puo' andar bene?
    [/CODE]
    public class AddInterestListener implements ActionListener
    {
    public AddInterestListener( BankAccount acc, JLabel lab )
    {
    account = acc;
    label = lab;
    }
    public void actionPerformed( ActionEvent event)
    {
    double interest = account.getBalance() + INTEREST_RATE / 100;
    account.deposit( interest );
    label.setText( "balance = " + account.getBalance() );

    }

    public static final double INTEREST_RATE = 10;
    private BankAccount account;
    private JLabel label;
    }
    [/CODE]
    Non riscrivere la ruota, usa le librerie.
    by Bjarne Stroustrup
    EIDON SOFT MEMBER

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.