2012-04-01 9 views
7

मुझे पता है कि JavaFX में श्रोताओं हैं कि पर बुलाया जाता है के लिए एक श्रोता जोड़ना, और मुझे यकीन है जावा। लेकिन मैं उलझन में हूं कि उन्हें कैसे कार्यान्वित किया जाए।जावा/JavaFX में एक चर जो चर परिवर्तन

मैं एक बूलियन चर है कि मेरे कार्यक्रम के दौरान बदल रहा है। हर बार बुलियन बदल जाता है, मैं एक समारोह myFunc() भागना चाहता हूँ।

इस आसानी से किया जा सकता है?

+0

आप हमें कुछ कोड दिखाया जा सका यहाँ एक अच्छा ट्यूटोरियल है? मुझे नहीं लगता कि आप जो पूछ रहे हैं वह संभव है लेकिन एक ही प्रभाव अलग तरीके से पूरा किया जा सकता है। – chandsie

उत्तर

4
इस रूप में सरल रूप

:

public void changeBooleanFlag(boolean bEnabled) 
{ 
    if(booleanFlag == bEnabled) return; 
    booleanFlag = bEnabled; 
    myFunc(); 
} 

और जब भी आप बूलियन ध्वज को बदलना चाहते हैं, तो आप यह इस पद्धति के माध्यम से करना चाहिए।

+3

यदि आप इस उत्तर के समाधान का उपयोग करते हैं, और यदि आप इस प्रक्रिया को एकाधिक धागे से एक्सेस कर रहे हैं, तो आप निश्चित रूप से कुछ सिंक्रनाइज़ेशन तंत्र को कार्यान्वित करना चाहते हैं। –

0

वहाँ (अपने आप से) आपकी समस्या

  1. सादे जावा का उपयोग करना, उस मामले में, आप अपने सेम के लिए श्रोताओं को जोड़ने जाएगा के लिए 2 समाधान कर रहे हैं और उसके बाद खुद ही सेटर विधि (पर श्रोता विधियां प्रारंभ फिर से), और चर निजी बनाने, तो यह केवल अपने सेटर विधि द्वारा संशोधित किया जा सकता है।
  2. दूसरा समाधान एक शुद्ध AOP ढांचे उपयोग कर रहा है (मैं जानता हूँ कि AspectJ यह कर सकते हैं) है, जो अपने चर के संशोधन को रोक सकता है, और फिर एक पहलू का उपयोग कर अपने श्रोता कहते हैं। मैं उल्लेख करूंगा कि @AspectJ (AspectJ का एनोटेशन समर्थन) का उपयोग करके, आपके पहलू शुद्ध जावा कक्षाएं होंगी, और एस्पेक्टजे समर्थन आईडीई की कोई आवश्यकता नहीं है।
+0

पहले समाधान के बारे में अधिक जानकारी के लिए JavaBeans विशिष्टता और नमूने देखें। –

0

यू ऑब्जर्वर डिजाइन पैटर्न का उपयोग कर सकते हैं। बस इस तरह:

public interface Listener 
    { 
     public void handle(Object o) ; 
    } 

    public class PropertiesChangeListener 
    { 
     public void handle(Object o) { 
     //DO SOMETHING... 
     } 
    } 

    public class Bean { 
     private boolean flag; 
     private List<Listener> listeners = new ArrayList<Listener>(); 

     public setFlag(boolean flag) { 
     this.flag = flag; 
     if (listeners.size() > 0) { 
      for (Listener l : this.listeners) { 
       l.handle(flag); //invoke 
      } 
     } 
     } 

     public registerListener(Listener listener) { 
     this.listeners.add(listener); 
     } 

     //..... other fields and methods 

    } 

    public class Main{ 

     public static void main(String[] args) { 
     Bean bean = new Bean(); 
     bean.registerListener(new PropertiesChangeListener()); 
     bean.setFlag(true); //handler method will be invoked.. 
     } 
    } 
22

आप JavaFX 2 का उपयोग कर रहे है तो यह दोनों JavaBeans घटक वास्तुकला और ऑब्जर्वर डिजाइन पैटर्न के लिए एक बाहर के बॉक्स समाधान प्रदान करता है। इसके अलावा यह संपत्ति बाइंडिंग द्वारा चर की स्थिति को जोड़ने की एक बड़ी लचीलापन देता है। नीचे दिया गया कोड संपत्ति बदलती घटनाओं और संपत्ति चर के बाध्यकारी को दर्शाता है। बेशक आप getFlag() और setFlag() जैसे विवरण छुपाने के लिए संपत्ति एक्सेसर्स को लपेट सकते हैं, और शेष एप्लिकेशन में उनका उपयोग कर सकते हैं।

public class Demo extends Application { 

    private BooleanProperty booleanProperty = new SimpleBooleanProperty(true); 

    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) { 

     // Add change listener 
     booleanProperty.addListener(new ChangeListener<Boolean>() { 

      @Override 
      public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) { 
       System.out.println("changed " + oldValue + "->" + newValue); 
       myFunc(); 
      } 
     }); 

     Button btn = new Button(); 
     btn.setText("Toggle boolean flag"); 
     btn.setOnAction(new EventHandler<ActionEvent>() { 

      @Override 
      public void handle(ActionEvent event) { 
       booleanProperty.set(!booleanProperty.get()); //toggle 
       System.out.println("toggled to " + booleanProperty.get()); 
      } 
     }); 

     // Bind to another property variable 
     btn.underlineProperty().bind(booleanProperty); 

     StackPane root = new StackPane(); 
     root.getChildren().add(btn); 
     primaryStage.setScene(new Scene(root, 300, 250)); 
     primaryStage.show(); 
    } 

    public boolean getFlag() { 
     return booleanProperty.get(); 
    } 

    public void setFlag(boolean val) { 
     booleanProperty.set(val); 
    } 
} 
2

मैं इसे PropertyChangeListener का उपयोग करके करूँगा। http://docs.oracle.com/javase/tutorial/uiswing/events/propertychangelistener.html

कोड का उदाहरण::

import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 
import java.util.ArrayList; 
import java.util.List; 

public class MyClass { 
    private final List<PropertyChangeListener> listeners = new ArrayList<>(); 
    private boolean b1, b2; 

    public MyClass() { 
    } 

    public boolean isB1() { 
     return b1; 
    } 

    public void setB1(boolean b1) { 
     boolean oldValue = this.b1; 
     this.b1 = b1; 
     firePropertyChange("b1", oldValue, b1); 
    } 

    public boolean isB2() { 
     return b2; 
    } 

    public void setB2(boolean b2) { 
     boolean oldValue = this.b2; 
     this.b2 = b2; 
     firePropertyChange("b2", oldValue, b2); 
    } 

    public void addPropertyChangeListener(PropertyChangeListener listener) { 
     listeners.add(listener); 
    } 

    private void firePropertyChange(String property, Object oldValue, Object newValue) { 
     for (PropertyChangeListener l : listeners) { 
      l.propertyChange(new PropertyChangeEvent(this, property, oldValue, newValue)); 
     } 
    } 

    /** 
    * Main method for tests. 
    * @param args 
    */ 
    public static void main(String[] args) { 
     MyClass m = new MyClass(); 

     m.addPropertyChangeListener(new PropertyChangeListener() { 
      @Override 
      public void propertyChange(PropertyChangeEvent e) { 
       String changedProperty = e.getPropertyName(); 
       System.out.println("Changed property: " + changedProperty); 
       System.out.println("New value: " + e.getNewValue()); 
       System.out.println("Old value: " + e.getOldValue()); 
       System.out.println(); 
      } 
     }); 

     m.setB1(true); 
     m.setB2(false); 
    } 
} 

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

  • कोई संबंधित समस्या नहीं^_^