2011-12-15 22 views
8

En primer lugar soy nuevo a Java:/Java - Escucha cambio de variable

He estado tratando de resolver este problema por mi cuenta durante aproximadamente 2 días, pero ahora no puedo conseguir alrededor de él el problema es que soy tratando de implementar un oyente de cambio variable. He intentado sin éxito implementar Observer y Observable en mi proyecto pero, en el mejor de los casos, no obtuve ningún éxito al envolver algunos elementos del código en while while pero eso falla.

De todos modos, esta es mi clase y, si lo miras, tengo algunas variables globales definidas después del constructor, necesito escuchar un cambio en todas esas variables globales si una cambia me gustaría ejecutar un método.

Me han dicho que JavaFX tiene métodos que pueden escuchar variables si alguien puede confirmar esto. De todos modos gracias por ayuda con anticipación.

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; 
    } 




} 

Respuesta

11

El procedimiento general para ser notificado de un cambio en una variable es la siguiente:

  1. En primer lugar, hacen las variables privado.
  2. Crear dos métodos para cada variable, una que establece su valor a un argumento (a menudo llamado setX(), donde X es el nombre de la variable), el otro que recupera su valor (getX())
  3. En todas partes se necesita leer o establecer la variable, llamar a los métodos en su lugar.
  4. En el método setX(), llame al notifyObserver() en su Observer s, en un bucle.

¡Y listo! Ahora, cada vez que se cambia la variable, se notifican los Observer s registrados. La parte clave de esta solución es que las variables deben ser privadas, de modo que ningún código pueda establecer sus valores sin pasar por los métodos setX().

+3

+1. ¿No puede usar el PropertyChangeListener? –

+1

Sí, PropertyChangeListener funciona bien también, y puede usar PropertyChangeSupport para notificar a los oyentes. Sin embargo, mencionó específicamente Observer/Observable. –

+0

Huh. Bueno, mis instrucciones anteriores parecen bastante claras y simples. ¿Hay algo que pueda hacer para mejorarlos? ¿Qué problemas o preguntas tienes? –

Cuestiones relacionadas