2011-12-15 94 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