2011-12-15 92 views
8

首先,我是全新到Java:/爪哇 - 听变量变化

我一直在试图解决现在我自己这个问题,约2天,但不能让周围的问题就是我试图实现一个可变更改监听器。我已经尝试过没有成功实现Observer和Observable到我的项目,但最好没有成功,我通过将代码的一些元素包装到while循环中,但很失败。

任何如何这是我的课,如果你看看它,我有一些全局变量定义后,构造函数我需要监听所有这些全局变量的变化,如果更改我想执行一个方法。

我被告知JavaFX有方法可以监听变量,有人可以确认这一点。 无论如何感谢您的帮助提前。

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




} 

回答

11

的一般程序通知更改的变量如下:

  1. 首先,使私有变量。
  2. 创建每个检索它的值(getX()
  3. 无处不在,你需要阅读或变量,其中一个它的值设置为一个参数(通常称为setX(),其中X是变量名),其他两种方法设置变量,改为调用方法。
  4. setX()方法中,请在您的Observer s上循环调用notifyObserver()

然后你去!现在每次变更变量时,都会通知注册Observer。该解决方案的关键部分是变量必须是私有的,以便没有代码可以在不通过setX()方法的情况下设置它们的值。

+3

+1。他不能使用PropertyChangeListener? – 2011-12-15 04:19:15