2011-12-15 12 views
8

Prima di tutto io sono nuovo di zecca a Java:/Java - Ascoltare cambiamento variabile

Ho cercato di risolvere questo problema da solo per circa 2 giorni, ma ora posso ottenere intorno ad esso il problema è che io sono cercando di implementare un listener di variabili change. Ho tentato senza successo di implementare Observer and Observable al mio progetto, ma con nessun risultato nel migliore dei casi sono arrivato avvolgendo alcuni elementi del codice in loop while, ma questo non funziona.

Qualsiasi sia la mia classe e se la si guarda ho alcune variabili globali definite dopo che il costruttore ho bisogno di ascoltare una modifica in tutte quelle variabili globali se una modifica vorrei eseguire un metodo.

Mi è stato detto che JavaFX ha metodi che possono ascoltare le variabili qualcuno può confermarlo. In ogni caso grazie per l'aiuto in anticipo.

public class Tower_Controller { 

    public Tower_Controller() { 
    } 

    //Global variables 
    String isSelected = null; 
    int hasModules = 0; 
    int cap_s = 0; 
    int cpu_s = 0; 
    int cap = 0; 
    int cpu = 0; 
    int shield = 0; 
    int armor = 0; 
    double em = 00.00; 
    double th = 00.00; 
    double ki = 00.00; 
    double ex = 00.00; 


    public void invoke() { 
     Invoke_GUI runnable = new Invoke_GUI(); 
     final JLabel tower_name = runnable.tower_name; 
     final JComboBox tower_select = runnable.tower_select; 
     final JTree module_browser = runnable.module_browser; 
     final JTree selected_modules = runnable.selected_modules; 

     final JProgressBar cap_bar = runnable.cap_bar; 
     final JProgressBar cpu_bar = runnable.cpu_bar; 

     final JLabel em_res = runnable.em; 
     final JLabel th_res = runnable.thermic; 
     final JLabel ki_res = runnable.kinetic; 
     final JLabel ex_res = runnable.explosive; 

     tower_select.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (isSelected != null) { 
        Events evt = new Events(); 
        evt.towerSelected(isSelected); 
       } else { 
        tower_name.setText(tower_select.getSelectedItem().toString()); 
        isSelected = tower_name.toString(); 
       } 
      } 
     }); 

     removeTower(tower_name); 
     runnable.setVisible(true); 

    } 



    public void updateValues(final JProgressBar cap_bar, final JProgressBar cpu_bar, final JLabel em_res, 
     final JLabel th_res, final JLabel ki_res, final JLabel ex_res){ 

     cap_bar.setMaximum(cap); 
     cap_bar.setString(cap_s + "/" + cap); 
     cap_bar.setStringPainted(true); 

     cpu_bar.setMaximum(cpu); 
     cpu_bar.setString(cpu_s + "/" + cpu); 
     cpu_bar.setStringPainted(true); 

     String em_v = String.valueOf(em); 
     em_res.setText(em_v); 

     String th_v = String.valueOf(th); 
     th_res.setText(th_v); 

     String ki_v = String.valueOf(ki); 
     ki_res.setText(ki_v); 

     String ex_v = String.valueOf(ex); 
     ex_res.setText(ex_v); 
    } 

    public void updateList(final ArrayList<String> nodes, final JTree selected_modules) { 
     DefaultMutableTreeNode nod = new DefaultMutableTreeNode(); 
     for (int i = 0; i < nodes.size(); i++) { 
      nod.add(new DefaultMutableTreeNode(nodes.get(i))); 
     } 
     selected_modules.setModel(new DefaultTreeModel(nod)); 
    } 

    public void removeTower(final JLabel tower_name) { 
     tower_name.addMouseListener(new MouseListener() { 

      @Override 
      public void mouseClicked(MouseEvent e) { 
       if (hasModules == 1 & isSelected != null) { 
        Events evt = new Events(); 
        evt.towerHasModules(); 
       } else if (isSelected == null) { 
       } else { 
        tower_name.setText("No Control Tower selected"); 
        isSelected = null; 
       } 
      } 

      @Override 
      public void mousePressed(MouseEvent e) { 
      } 

      @Override 
      public void mouseReleased(MouseEvent e) { 
      } 

      @Override 
      public void mouseEntered(MouseEvent e) { 
      } 

      @Override 
      public void mouseExited(MouseEvent e) { 
      } 
     }); 
    } 

    public JLabel setTowerName(JLabel a, String name) { 
     a.setText(name); 
     return a; 
    } 




} 

risposta

11

La procedura generale essere avvisati di una modifica a una variabile è la seguente:

  1. In primo luogo, fanno le variabili private.
  2. Creare due metodi per ogni variabile, uno che imposta il suo valore su un argomento (spesso chiamato setX(), dove X è il nome della variabile), l'altro, che recupera il suo valore (getX())
  3. Ovunque avete bisogno di leggere o imposta la variabile, chiama invece i metodi.
  4. Nel metodo setX(), chiamare notifyObserver() sul proprio Observer s, in un ciclo.

Ed ecco fatto! Ora ogni volta che la variabile viene cambiata, vengono registrati i numeri Observer registrati. La parte fondamentale di questa soluzione è che le variabili devono essere private, in modo che nessun codice possa impostare i loro valori senza passare attraverso i metodi setX().

+3

+1. Non può usare PropertyChangeListener? –

+1

Sì, anche PropertyChangeListener funziona bene ed è possibile utilizzare PropertyChangeSupport per notificare i listener. Ha menzionato specificamente Observer/Observable, però. –

+0

Huh. Bene, le mie istruzioni di cui sopra sembrano abbastanza chiare e semplici. C'è qualcosa che posso fare per migliorarli? Quali problemi o domande hai? –