2011-12-15 8 views
8

पहले से सुनो मैं जावा के लिए नया हूँ:/जावा - चर परिवर्तन सभी के

मैं अब के बारे में 2 दिनों के लिए अपने दम पर इस समस्या को हल करने के लिए कोशिश कर रहे हैं लेकिन नहीं कर सकते इसके चारों ओर पाने समस्या मैं कर रहा हूँ है एक परिवर्तनीय परिवर्तन श्रोता लागू करने की कोशिश कर रहा है। मैंने अपनी परियोजना में ऑब्जर्वर और ऑब्जर्जेबल को लागू करने के लिए सफलता के बिना प्रयास किया है, लेकिन सबसे अच्छा सफलता नहीं मिली है, मैं कोड के कुछ तत्वों को लूप के दौरान लपेटकर आया हूं लेकिन यह अच्छी तरह से विफल रहता है।

कोई भी मेरी कक्षा कैसे है और यदि आप इसे देखते हैं तो मेरे पास कुछ ग्लोबल वैरिएबल हैं जो रचनाकार के बाद परिभाषित किए गए हैं, मुझे उन सभी ग्लोबल वैरिएबल में बदलाव की आवश्यकता है यदि कोई परिवर्तन करता है तो मैं एक विधि निष्पादित करना चाहता हूं।

मुझे बताया गया है कि जावाएफएक्स में ऐसे विधियां हैं जो चर को सुन सकती हैं, कोई इसकी पुष्टि कर सकता है। किसी भी तरह से अग्रिम में मदद के लिए धन्यवाद।

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. प्रत्येक चर, जिनमें एक तर्क (अक्सर setX() कहा जाता है, जहां X चर नाम है) करने के लिए अपने मूल्य निर्धारित करता है, अन्य जो अपने मूल्य (getX())
  3. हर जगह आप पढ़ सकते हैं या करने की जरूरत को पुन: प्राप्त करने के दो तरीके बनाएं चर सेट करें, इसके बजाय विधियों को कॉल करें।
  4. setX() विधि में, पर अपने Observer एस पर एक लूप में कॉल करें।

और वहां आप जाते हैं! अब हर बार चर बदल जाता है, पंजीकृत Observer एस अधिसूचित हैं। इस समाधान का मुख्य भाग यह है कि चर को निजी होना चाहिए, ताकि कोई कोड setX() विधियों के बिना बिना अपने मूल्य निर्धारित कर सके।

+3

+1। क्या वह PropertyChangeListener का उपयोग नहीं कर सकता? –

+1

हाँ, PropertyChangeListener भी ठीक काम करता है, और आप श्रोताओं को सूचित करने के लिए PropertyChangeSupport का उपयोग कर सकते हैं। उन्होंने विशेष रूप से पर्यवेक्षक/पर्यवेक्षक का उल्लेख किया, हालांकि। –

+0

हू। खैर, मेरे निर्देश ऊपर स्पष्ट और सरल लगते हैं। क्या मैं उन्हें सुधारने के लिए कुछ भी कर सकता हूं? आपके पास क्या समस्याएं या प्रश्न हैं? –

संबंधित मुद्दे