Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    Modificare una label con chiamata a funzione

    Ciao a tutti!

    Ho creato questo codice:
    codice:
    //... librerie, classe, ecc...
    
        private javax.swing.JLabel lbl1;
    
        public void view() {
            setUp();
        }
    
        public void setUp(){
            lbl1.setText("prova");
        }
    Quando invoco view() non viene rilevato nessun errore ma la label lbl1 non viene modificata.
    Se invece clicco un pulsante con codice evento:

    codice:
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                       
            setUp();
        }
    La label viene modificata.

    Immagino ci sia qualcosa di concettuale che al momento mi sfugge:
    1) Perchè con view() non riesco a modificare la label?
    2) Come posso far per poter modificare la label invocando view()?

    Grazie!

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Quando si modificano componenti è sempre il caso di richiamare un repaint (o addirittura un validate) sul contenitore affinché si sia "certi" che le modifiche vengano effettivamente apportate (in verità la modifica è stata apportata solo che il componente non è stato ridisegnato)
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Grazie!
    Ho aggiunto queste due righe in coda al codice di setUp().
    labelNomeCurPlayer.validate();
    labelNomeCurPlayer.validate();
    Ma non ottengono alcun effetto... Ho provato anche con repaint()...

    Dove sbaglio?


    P.S. Quindi quando chiamo setUp() da pulsante questo invoca il metodo repaint o validate in automatico sulle label modificate?

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    La modifica del solo testo di una Label non dovrebbe necessitare di un repaint o di un validate() (validate() e rapaint() andrebbero, comunque, richiamati sul contenitore dell'oggetto).

    L'unica spiegazione che mi so dare è che il metodo view() non venga affatto richiamato: il codice che hai postato non fa vedere dove questo dovrebbe essere richiamato. Prova a postare la parte di codice che effettua la chiamata.


    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
    Ciao!

    E' un po' un casino da postare il codice, ma sono sicuro che view() viene eseguito perchè svolge tutte le azioni presenti nel suo blocco, che non contiene solo una chiamata a setUp().


  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Sei sicuro che per qualche strano motivo non ti salti il pezzo di codice in cui chiami la setUp() da view (che so un if else, uno switch, ecc). Prova a mettere una stampa di prova in view alla riga prima di setUp(); e guarda se questa funziona.

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    E' impossibile che venga eseguito setUp().
    Prova a guardare questo semplicissimo esempio che ho scritto al volo:
    codice:
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    
    public class Mio extends JFrame {
    
       private class Tempo extends Thread {
          public void run() {
             try {
                sleep(5000);
                cambiaLabel();
             } catch (Exception e) { e.printStackTrace(); }
          }
       }
    
       private JLabel lbl;
    
       public Mio() {
          getContentPane().setLayout( null );
          lbl = new JLabel("Prova");
          lbl.setBounds(30, 30, 130, 20);
          getContentPane().add( lbl );
    
          setDefaultCloseOperation(EXIT_ON_CLOSE);
          setTitle("Prova");
          setSize(500, 500);
          setVisible(true);
    
          ( new Tempo() ).start();
       }
    
       private void cambiaLabel() {
          lbl.setText("Label Cambiata");
       }
    
       public static void main(String [] args) {
          Mio m = new Mio();
       }
    }
    Non chiamo alcun validate() né repaint().
    Faccio partire un thread che cambia la JLabel dopo 5 secondi. E funziona perfettamente.

    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

  8. #8
    Riciao!

    Sei sicuro che per qualche strano motivo non ti salti il pezzo di codice in cui chiami la setUp() da view (che so un if else, uno switch, ecc). Prova a mettere una stampa di prova in view alla riga prima di setUp(); e guarda se questa funziona.
    Sì, ho fatto anche il test che suggerivi tu. L'unica cosa un po' "strana" di view è che chiama anche il metodo statico che disegna l'interfaccia grafica. A sto punto:
    ho due JFrame NewJFrame e NewJFrame2. il main sta in NewJFrame. Al clic sul pulsante JButton3 nascondo il NewJFrame2 e visualizzo NewJFrame:

    Nella classe NewJFrame2:
    codice:
        private static NewJFrame2 pointer = new NewJFrame2();
        private NewJFrame pointer2 = new NewJFrame();
    .....
        private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
            //Distribuisco le proprietà
            for (int i = 0; i < game.getNumPlayers(); i++) {
                for (int j = 0; j < game.getNumTerr(); j++) {
                    game.daiProprieta(i);
                }
    	}
            pointer.setVisible(false);
            pointer2.view(game);
        }
    ------------------------------------------------------
    Nella classe NewJFrame:
    codice:
        public void view(Gioco game2) {
            view2();
            int mossa=0;
            game = game2;
            ....
            setUp();
        }
        
        public void setUp(){
            labelNomeCurPlayer.setText(game.var2);
            labelCurSoldi.setText(game.var1);
            jTextArea1.setText(game.var3);
        }
    
    /* Generato automaticamente da NetBean... Che sia qui il problema? */
    
           public static void view2(){
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new NewJFrame().setVisible(true);
                }
            });
        }

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    al posto della chiamata a view2() prova a mettere this.setVisible(true);
    Se non andasse ancora, e' meglio se posti tutta la classe NewJFrame, se per te non e' un problema.

  10. #10
    Miticoooo simo7784!

    Così funziona... Certo resta la domanda: perchè prima no. Ma l'informatica è piena di questi misteri mai risolti

    e grazie ancora a tutti!

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.