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

    Collegare evento pulsante in un'altra finestra per stampare

    Nella Classe principale dove si apre la finestra con il pulsante "OK", ho scritto questo codice,
    Quando premo il pulsante "OK", esso mi apre una nuova finestra di nome "TN_Ricalcolo" dove ho creato un JLabel. Ma allo stesso momento vorrei anche che stampasse "CIAO". Come posso fare grazie?


    Classe principale:
    codice:
    ...
    OK = new JButton("OK");
    		OK.addActionListener(new ActionListener() {
    		    public void actionPerformed(ActionEvent e) {
    		        //codice eseguito in seguito alla pressione del pulsante button001
    		    	
    		    	OK.addActionListener(this);
    		    	TN_Ricalcolo TNRicalcolo = new TN_Ricalcolo();
    		    	TNRicalcolo.setVisible(true);
      
    		        testo.STAMPA_ricalcolo.setText("CIAO");
    				
    
    
    		    }
    		});
    ...
    Classe TN_Ricalcolo:

    codice:
    ...
    public class TN_Ricalcolo extends JFrame {
    
    
    	public JPanel contentPane;
    	public JLabel STAMPA_ricalcolo;
    
    
    	
    	public static void main(String[] args) {
    		EventQueue.invokeLater(new Runnable() {
    			public void run() {
    				try {
    					TN_Ricalcolo frame = new TN_Ricalcolo();
    					frame.setVisible(true);
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		});
    	}
    
    
    	
    	public TN_Ricalcolo() {
    		setTitle("Ricalcolo");
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setBounds(1400, 430, 450, 500);
    		contentPane = new JPanel();
    		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    		setContentPane(contentPane);
    		contentPane.setLayout(new CardLayout(0, 0));
    		
    		STAMPA_ricalcolo = new JLabel();
    		contentPane.add(STAMPA_ricalcolo, "name_32038992584914");
    	}
    
    
    }
    grazie.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da desiderio Visualizza il messaggio
    Nella Classe principale dove si apre la finestra con il pulsante "OK", ho scritto questo codice,
    Quando premo il pulsante "OK", esso mi apre una nuova finestra di nome "TN_Ricalcolo" dove ho creato un JLabel. Ma allo stesso momento vorrei anche che stampasse "CIAO".
    Ci sono un po' di cose errate.

    Innanzitutto fare nel actionPerformed

    OK.addActionListener(this);

    non ha senso e non serve. Così registri un ulteriore listener (quello stesso listener in cui è questa riga) sul pulsante OK. Questo vuol dire che ad una seconda azione su OK, si apriranno 2 frame TN_Ricalcolo, ad una terza azione, 3 frame TN_Ricalcolo ecc...
    Ripeto: NON ha senso.


    Poi in:

    testo.STAMPA_ricalcolo.setText("CIAO");

    Cosa volevi fare? Cosa è "testo"? Volevi impostare "CIAO" sul JLabel che in TN_Ricalcolo è la variabile di istanza pubblica chiamata STAMPA_ricalcolo?
    Allora, tecnicamente, basta usare il reference che hai appena ottenuto dalla costruzione di TN_Ricalcolo:

    TN_Ricalcolo TNRicalcolo = new TN_Ricalcolo();
    TNRicalcolo.setVisible(true);

    TNRicalcolo.STAMPA_ricalcolo.setText("CIAO");


    Ma tutto questo, pur tecnicamente corretto e funzionante (il campo infatti è pubblico, quindi accessibile dall'esterno) NON va bene e non è buono.
    Quelle due variabili di istanza in TN_Ricalcolo NON dovrebbero essere public e tu dall'esterno non dovresti andare a settare direttamente qualcosa in un componente di un altro frame.


    Infine i nomi che hai usato per variabili e classi NON sono buoni e non seguono affatto le convenzioni standard.

    Quindi dovresti chiarirti le idee su:
    a) convenzioni standard sulle denominazioni
    b) principi di incapsulamento/information-hiding
    c) concetti sui listener
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Grazie mille inizio a studiarci con i suggerimenti dati.
    Posso chiederti ma se al posto di "CIAO" volessi stampare una variabile (es. che si chiama VL) di un altro metodo del pulsante "OK":
    codice:
    OK.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
    Come posso fare?
    Grazie

    Essendo senza grosse basi ti volevo chiedere cosa significa quando dici: "
    (il campo infatti è pubblico, quindi accessibile dall'esterno) NON va bene e non è buono". Perchè aveve capito leggendo qua e la, che se il campo è public posso usarlo tramite altre classi altrimenti no. Accessibile dall'esterno cosa può provacare di errato? Grazie ancora

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da desiderio Visualizza il messaggio
    ma se al posto di "CIAO" volessi stampare una variabile (es. che si chiama VL) di un altro metodo del pulsante "OK"
    Come posso fare?
    Che vuol dire "di un altro metodo"?

    Invece che:
    TNRicalcolo.STAMPA_ricalcolo.setText("CIAO");

    nessuno ti vieta di passare una variabile:
    TNRicalcolo.STAMPA_ricalcolo.setText(varStr);

    Ma è chiaro che varStr deve essere una variabile che esiste da qualche parte e che è visibile/accessibile dal punto in cui la usi.
    Se non lo è .... è chiaro che non la puoi usare.

    Quote Originariamente inviata da desiderio Visualizza il messaggio
    Accessibile dall'esterno cosa può provacare di errato?
    Che la tua classe non ha controllo su chi/dove/come usa la variabile di istanza public e non puoi quindi imporre dei controlli sui valori, quelli che si definiscono in generale "invarianti".

    Immagina una classe Range (di interi) con due variabili di istanza min e max. Noi vogliano che max sia sempre maggiore/uguale a min, mai inferiore. Se i campi fossero pubblici, l'accesso a queste variabile sarebbe sparpagliato in chissà quanti punti e la tua classe Range NON ne avrebbe il controllo.

    Se invece li tieni privati e metti dei metodi "accessori" (getter e setter), puoi fare:

    codice:
    public class Range {
        private int min;
        private int max;
    
        public int getMin() {
            return min;
        }
    
        public void setMin(int min) {
            if (min > max) {
                throw new IllegalArgumentException("min non può essere superiore a max");
            }
    
            this.min = min;
        }
    
        public int getMax() {
            return max;
        }
    
        public void setMax(int max) {
            if (max < min) {
                throw new IllegalArgumentException("max non può essere inferiore a min");
            }
    
            this.max = max;
        }
    }

    A parte truschini con la reflection di Java, non c'è modo di accedere direttamente ai campi min/max, bisogna sempre passare per i metodi setMin/setMax e questo ti permette di mantenere il controllo sull'invariante "max deve essere maggiore/uguale a min".
    Chi usa normalmente la classe Range, quindi NON può violare questo invariante.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    è che le variabile in questione stà qui:

    codice:
    OK.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent arg0) {
                    
                
                    
                    double VL;
    ecc... ecc..
    più in basso c'è:

    codice:
    OK =newJButton("OK");
            OK.addActionListener(newActionListener(){
                publicvoid actionPerformed(ActionEvent e){
                    //codice eseguito in seguito alla pressione del pulsante button001
                    
                    OK.addActionListener(this);
                    TN_Ricalcolo TNRicalcolo=new TN_Ricalcolo();
                    TNRicalcolo.setVisible(true);
      
                    testo.STAMPA_ricalcolo.setText("CIAO"); qui vorrei mettere il VL 
                    
    
    
                }
            });

    invece
    per quanto riguarda le variabili pubbliche ora ho capito.
    Ma che errori possono succedere se non sono pubbliche, perchè ora capisco il metodo corretto ma non le cause di quello scorretto. grazie ancora

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da desiderio Visualizza il messaggio
    codice:
    testo.STAMPA_ricalcolo.setText("CIAO"); qui vorrei mettere il VL
    Non puoi. Le variabili locali di un qualunque metodo(/costruttore) sono appunto LOCALI. NON sono visibili da altri metodi. Devi trovare altre strade dal punto di vista del "design" generale. Che quindi devi apprendere e capire meglio.

    Quote Originariamente inviata da desiderio Visualizza il messaggio
    Ma che errori possono succedere se non sono pubbliche, perchè ora capisco il metodo corretto ma non le cause di quello scorretto. grazie ancora
    Un motivo pratico l'ho detto prima. Se la variabile di istanza è pubblica, tu NON hai controllo su chi/dove/come accede alle variabili. Non puoi imporre e garantire degli "invarianti" e se andiamo a livello più fine non puoi nemmeno gestire una eventuale sincronizzazione e quindi non potresti nemmeno rendere thread-safe la classe.
    Nella Range che ho mostrato prima, mi basterebbe dichiarare quei 4 metodi come synchronized et voilà, la classe sarebbe thread-safe perlomeno rispetto all'uso di ciascun singolo metodo. Se min/max fossero pubbliche, questo non lo potresti garantire.

    Inoltre c'è un discorso più ampio legato al concetto di information-hiding, cioè il nascondere informazioni che non sono (e "non dovrebbero") essere importanti all'esterno.
    Domandati: è molto importante che qualcuno sappia della esistenza dei campi min/max? Se in futuro tu che es. avessi in gestione la classe Range volessi cambiare i nomi dei campi in valoreMin e valoreMax? Se sono privati puoi farlo, puoi cambiare i nomi (mantenendo i 4 metodi così come sono). Se sono pubblici, non puoi cambiarli senza che all'esterno qualcosa si "spacca" e debba poi essere corretto.
    Se qualcosa è pubblico fa parte del "contratto" verso l'esterno della classe. E non puoi (non sempre facilmente, perlomeno) cambiarlo in futuro.

    Morale della favola: nascondi il più possibile e non esporre (all'esterno) variabili di istanza se NON c'è un motivo davvero valido e impellente.
    Ultima modifica di andbin; 13-12-2016 a 11:11
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  7. #7
    Ok grazie mille

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 © 2024 vBulletin Solutions, Inc. All rights reserved.