Visualizzazione dei risultati da 1 a 3 su 3

Discussione: problema JLabel

  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2012
    residenza
    matrix
    Messaggi
    56

    problema JLabel

    Salve, stavo provando a far comunicare due classi (EventiRemember e Numero) il problema subentra quando cerco di usare il metodo setText sulla JLabel chiamata l, so che l'errore e' causato dal fatto che non posso usare il setText() su una label di un altra classe ma non so come risolvere il problema.

    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    class EventiRemember extends JFrame
    {
    	EventiRemember()
    	{
                Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
                Numero n = new Numero();
                
                int w = 0;
                int h = 0;
                int w1 = 400;
                int h1 = 400;
                
                w = (((d.width)/2)-(w1/2));
                h = (((d.height)/2)-(h1/2));
                
                this.setBounds(w,h,w1,h1);
                this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                this.setLayout(null);
                this.setVisible(true);
                
                JButton bottone = new JButton("Clicca");
                bottone.setBounds(150,200,100,50);
                bottone.addMouseListener(new Ascoltatore());
                bottone.setVisible(true);
                
                JLabel l = new JLabel();
                l.setBounds(150,10,100,50);
                l.setVisible(true);
                
                
                this.add(bottone);
                this.add(l);
    	}
    	public static void main(String args[])
    	{
    		EventiRemember e = new EventiRemember();            
    	}
    }
            
    class Ascoltatore extends MouseAdapter
    {
        int k = 0;
    	public void mouseClicked(MouseEvent oggettoEvento)
    	{
                Numero n = new Numero();
                k++;
                n.i = k;
                if(n.i > 0)
                {
                    l.setText(""+n.p+"");      //errore
                }
                if(n.i == 100)
                {
                    System.exit(0);
                }
    	}
    }
    
    //la classe numero contiene solo le variabili int i = 0; int p = 0;

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: problema JLabel

    Originariamente inviato da astolfo96
    il problema subentra quando cerco di usare il metodo setText sulla JLabel chiamata l, so che l'errore e' causato dal fatto che non posso usare il setText() su una label di un altra classe ma non so come risolvere il problema.
    La gestione degli eventi in una interfaccia grafica AWT/Swing è una cosa che in genere va fatta in modo molto "intimo" con la classe dove vengono creati/gestiti i componenti. In sostanza questo vuol dire che tipicamente si usano delle inner-class. Non classi esterne e slegate.

    Questo non vuol dire che con il tuo approccio non sia tecnicamente possibile. Sarebbe possibile innanzitutto se tenessi i riferimenti ai componenti come campi di istanza (non come variabili locali come hai adesso), se alla istanza di Ascoltatore passassi il riferimento alla istanza di EventiRemember e se in quest'ultima offrissi qualche metodo pubblico (come minimo ... non accedere direttamente ai campi!). Ma questo sarebbe un design abbastanza discutibile, che porta più dubbi/problemi che altro.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Perché incasinarsi la vita con il MouseListener quando c'è ActionListener?

    codice:
    tuoPulsante.addActionListener(new ActionListener() 
    {
    
        @Override 
        public void actionPerfomed(ActionEvent e) 
        {
            System.out.println("PULSANTE CLICCATO!");
        }
    
    });
    Facendo in questo modo (con la classe interna intendo) tra l'altro riesci anche a vedere la label l (che brutto nome...), dopo averla dichiarata final ovviamente (questo perché è una variabile locale che stai usando dentro una classe interna anonima). In alternativa dovresti passare al listener un riferimento all'altra classe...
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

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.